python - 比较两个数据框,如果电子邮件相同,则替换唯一 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```
解决方案
如您所见,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 存储为整数,因为您在转换为整数后进行测试。
推荐阅读
- c++ - hboehm 垃圾收集器未初始化值错误和泄漏
- javascript - 从 JSON 数组向列表添加项目
- python - 使用 Pandas 根据数据值从 excel 中拆分数据
- c# - AxAcroPdf 显示侧栏
- node.js - node-api.h 问题,同时使用 node-gyp 配置构建
- javascript - 动态创建具有高度和宽度的输入
- javascript - 什么是最佳实践,直接在渲染或状态中使用 const?
- git - 使用本地中央存储库和 2 台开发人员机器进行开源贡献
- java - 如果在 Spring Boot 中自动装配类,如何在静态区域中使用实例变量
- c# - 如何将复选框对象存储在列表中?