将数据框列中的 TLD 和 SLD 提取到新列中
Extract TLDs , SLDs from a dataframe column into new columns
我正在尝试从数据框中的列中提取顶级域 (TLD)、二级域 (SLD) 等并添加到新列中。目前我有一个解决方案,我将其转换为列表,然后使用 tolist
,但由于这是顺序追加,因此无法正常工作。例如,如果 url 有 3 个级别,那么映射就会变得混乱
df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4],"C":["xyz[.]com","abc123[.]pro","xyzabc[.]gouv[.]fr"]})
df['C'] = df.C.apply(lambda x: x.split('[.]'))
df.head()
A B C
0 1 2 [xyz, com]
1 2 3 [abc123, pro]
2 3 4 [xyzabc, gouv, fr]
d = [pd.DataFrame(df[col].tolist()).add_prefix(col) for col in df.columns]
df = pd.concat(d, axis=1)
df.head()
A0 B0 C0 C1 C2
0 1 2 xyz com None
1 2 3 abc123 pro None
2 3 4 xyzabc gouv fr
我希望 C2 始终包含 TLD (com,pro,fr) 并且 C1 始终包含 SLD
我相信有更好的方法可以正确地做到这一点,并希望得到任何指点。
您可以移动 Cx
列:
df.loc[:, "C0":] = df.loc[:, "C0":].apply(
lambda x: x.shift(periods=x.isna().sum()), axis=1
)
print(df)
打印:
A0 B0 C0 C1 C2
0 1 2 NaN xyz com
1 2 3 NaN abc123 pro
2 3 4 xyzabc gouv fr
您还可以使用带有负查找的正则表达式和 split
内置 pandas
以及 expand
df[['C0', 'C2']] = df.C.str.split('\[\.\](?!.*\[\.\])', expand=True)
df[['C0', 'C1']] = df.C0.str.split('\[\.\]', expand=True)
这给了
A B C C0 C2 C1
0 1 2 xyz[.]com xyz com None
1 2 3 abc123[.]pro abc123 pro None
2 3 4 xyzabc[.]gouv[.]fr xyzabc fr gouv
我正在尝试从数据框中的列中提取顶级域 (TLD)、二级域 (SLD) 等并添加到新列中。目前我有一个解决方案,我将其转换为列表,然后使用 tolist
,但由于这是顺序追加,因此无法正常工作。例如,如果 url 有 3 个级别,那么映射就会变得混乱
df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4],"C":["xyz[.]com","abc123[.]pro","xyzabc[.]gouv[.]fr"]})
df['C'] = df.C.apply(lambda x: x.split('[.]'))
df.head()
A B C
0 1 2 [xyz, com]
1 2 3 [abc123, pro]
2 3 4 [xyzabc, gouv, fr]
d = [pd.DataFrame(df[col].tolist()).add_prefix(col) for col in df.columns]
df = pd.concat(d, axis=1)
df.head()
A0 B0 C0 C1 C2
0 1 2 xyz com None
1 2 3 abc123 pro None
2 3 4 xyzabc gouv fr
我希望 C2 始终包含 TLD (com,pro,fr) 并且 C1 始终包含 SLD 我相信有更好的方法可以正确地做到这一点,并希望得到任何指点。
您可以移动 Cx
列:
df.loc[:, "C0":] = df.loc[:, "C0":].apply(
lambda x: x.shift(periods=x.isna().sum()), axis=1
)
print(df)
打印:
A0 B0 C0 C1 C2
0 1 2 NaN xyz com
1 2 3 NaN abc123 pro
2 3 4 xyzabc gouv fr
您还可以使用带有负查找的正则表达式和 split
内置 pandas
以及 expand
df[['C0', 'C2']] = df.C.str.split('\[\.\](?!.*\[\.\])', expand=True)
df[['C0', 'C1']] = df.C0.str.split('\[\.\]', expand=True)
这给了
A B C C0 C2 C1
0 1 2 xyz[.]com xyz com None
1 2 3 abc123[.]pro abc123 pro None
2 3 4 xyzabc[.]gouv[.]fr xyzabc fr gouv