将数据框列中的 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