我有这样的数据帧:
id | 名称 | 电子邮件 | |
---|---|---|---|
1 | a@e.com、b@e.com,c@e.com和d@e.com | ||
2 | f | f@gmail.com |
首先使用DataFrame.explode
和由Series.str.split
分割的值,然后比较@
之前的值,如果没有匹配集缺失值和最后一次类似缺失值的排序在DataFrame的末尾,则将range
分配给id
列:
df = df.assign(emails = df['emails'].str.split(',')).explode('emails')
mask = df['name'].eq(df['emails'].str.split('@').str[0])
df['name'] = np.where(mask, df['name'], np.nan)
df = df.sort_values('name', key=lambda x: x.isna(), ignore_index=True)
df['id'] = range(1, len(df) + 1)
print (df)
id name emails
0 1 a a@e.com
1 2 f f@gmail.com
2 3 NaN b@e.com
3 4 NaN c@e.com
4 5 NaN d@e.com