首页 > 解决方案 > 比较两个数据框,如果电子邮件相同,则替换唯一 ID

问题描述

我有 df1 有 200k 记录和 df2 有 9k 记录。我想检查电子邮件 isd 是否相同,如果相同,则检查唯一 ID,如果唯一 ID 不同,则将 df1 唯一 ID 替换为 df2 唯一 ID。

我尝试了这段代码,但它花费了太多时间。如何减少它的时间?

   ...:     for index2, row2 in df2.iterrows():
   ...:          #print(row2['Email'])           
   ...:          if row1['email']==row2['Email']:    
   ...:            #print(row1['email'],row2['Email'])            
   ...:            if int(row1['unique_ID'])!=int(row2['unique_ID']):
   ...:              print("yes")                           
   ...:              row1['unique_ID']=row2['unique_ID']
   ...:              df1.loc[index1]=row1```


标签: pythonpython-3.xpandasdataframe

解决方案


如您所见,Iterrows 非常慢。使用合并、分组和过滤来查找相关行并同时更改所有行的 ID。您可以使用 groupby,然后计算每封电子邮件有多少个唯一 ID。这是一个玩具示例:

row1list = ['stack', '10']
row2list = ['overflow', '20']
row3list = ['overflow', '30']
df1 = pd.DataFrame([row1list, row2list, row3list], columns=['email', 'unique_ID'])

row1list = ['stack', '10']
row2list = ['overflow', '40']
df2 = pd.DataFrame([row1list, row2list], columns=['email', 'unique_ID'])

df_conflicting_ids = df1.groupby('email', as_index=False).agg({
    'unique_ID': lambda x: len(pd.Series.unique(x))})

df_conflicting_ids = df_conflicting_ids.rename(columns={'unique_ID':'unique_ID_count'})
df_conflicting_ids = df_conflicting_ids[df_conflicting_ids['unique_ID_count'] > 1]

print(df_conflicting_ids)
#       email  unique_ID_count
# 0  overflow                2

del df_conflicting_ids['unique_ID_count']  # don't need column anymore

df_conflicting_ids = df_conflicting_ids.merge(df2, on='email', how='left')
df_conflicting_ids = df_conflicting_ids.rename(columns={'unique_ID':'master_unique_ID'})

df1 = df1.merge(df_conflicting_ids, on='email', how='left')
df1.loc[df1['master_unique_ID'].notnull(), 'unique_ID'] = df1['master_unique_ID']
print(df1)
#       email unique_ID master_unique_ID
# 0     stack        10              NaN
# 1  overflow        40               40
# 2  overflow        40               40

del df1['master_unique_ID']  # don't need column anymore

我不确定在覆盖 unique_ID 后是否要删除重复项。此外,您可能希望将 unique_ID 存储为整数,因为您在转换为整数后进行测试。


推荐阅读