为了账号安全,请及时绑定邮箱和手机立即绑定

pandas,如果行包含通配符文本,则合并重复项

pandas,如果行包含通配符文本,则合并重复项

PHP
守候你守候我 2023-11-09 21:14:31
我有一个重复项的数据集 ( ID)。数据集包含信息和电子邮件。我正在尝试连接电子邮件(如果行有字符@),然后删除重复项。如何附加仅包含电子邮件地址的行?@我认为我可以通过使用通配符并替换这部分来 跳过附加包含字符的所有行if row['Store1_Email']: # <- not working对于任何这些尝试,但没有任何效果:1.if str('**@**') in row['Store1_Email']: # <- not working错误:Traceback (most recent call last):  File "g:/Till/till_duplicate.py", line 35, in <module>    if str('**@**') in row['Store1_Email']:TypeError: argument of type 'float' is not iterablePS G:\Till>错误:Traceback (most recent call last):  File "g:/Till/till_duplicate.py", line 35, in <module>    if df_merged_duplicates[df_merged_duplicates.loc[i, 'Store1_Email'].str.contains('@')]:AttributeError: 'str' object has no attribute 'str'PS G:\Till>
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我会使用“拆分-应用-组合”的方法。在 pandas 中,您可以使用该groupby函数来执行此操作,然后应用一个函数将电子邮件地址组合到每个组中(在这种情况下,您可以按 col 进行分组)ID。


我编写了一个函数来组合给定列的电子邮件地址:


def combine_emails(series):

    strs = [s for s in series.astype(str).values if '@' in s]

    combined_emails = ",".join(strs)

    if combined_emails !='':

        return combined_emails

    else:

        return np.nan

然后,我编写了一个函数来获取每个分组数据帧的第一行,并调用电子邮件列上的组合函数来填充行电子邮件值:


def combine_duplicate_rows(df):

    first_row = df.iloc[0]

    for email_col in ['Store1_Email', 'Store2_Email', 'Store3_Email', 'Store4_Email']:

        first_row[email_col] = combine_emails(df[email_col])

    return first_row

然后您可以将其应用combine_duplicate_rows到您的组中并获得解决方案:


In [71]: df.groupby('ID').apply(combine_duplicate_rows)

Out[71]:

    ID Header 1  Header 2  Header 3  Header 4  Header 5                           Store1_Email  Header 9  Store2_Email  Header 12  Store3_Email  Header 17         Store4_Email

ID

1    1       AA       NaN       NaN       NaN       NaN                     Email@company1.com       NaN           NaN        NaN           NaN        NaN  Email2@company2.com

2    2       BB       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

3    3       CC       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

4    4       DD       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

5    5       EE       NaN       NaN       NaN       NaN  Email@company2.com,Email@company2.com       NaN           NaN        NaN           NaN        NaN                  NaN

6    6       FF       NaN       NaN       NaN       NaN  Email@company3.com,Email@company3.com       NaN           NaN        NaN           NaN        NaN                  NaN

7    7       GG       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

8    8       HH       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

9    9       II       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN  Email2@company3.com

10  10       JJ       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

11  11       KK       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN  Email2@company4.com

12  12       LL       NaN       NaN       NaN       NaN  Email@company4.com,Email@company4.com       NaN           NaN        NaN           NaN        NaN                  NaN

13  13       MM       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

14  14       NN       NaN       NaN       NaN       NaN                                    NaN       NaN           NaN        NaN           NaN        NaN                  NaN

然后你就会有一个重复的ID列,但你可以删除它


del df['ID']


查看完整回答
反对 回复 2023-11-09
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信