如何合并存在重复关联字段的pandas DataFrame:销售表与客户表关联问题
问题原因
merge后行数超出预期的核心原因是客户表(df2)中的关联键Id_Customer存在重复值:pandas的merge逻辑为左表每一行匹配右表所有对应ID的行,若右表同一个Id_Customer存在N条重复记录,左表对应行就会生成N条结果,最终总行数就会超过左表原行数。
解决步骤
- 第一步:确认客户表重复情况
运行代码查看客户表中重复的Id_Customer数量:
print(df2['Id_Customer'].duplicated().sum())
- 第二步:根据重复行的业务含义处理客户表
- 若重复行是无效冗余、同一个Id_Customer的所有字段信息完全一致:直接对客户表按Id_Customer去重
# 保留每个Id_Customer的第一条记录 df2_unique = df2.drop_duplicates(subset='Id_Customer', keep='first')- 若重复行是同一个客户的多版本有效信息(比如不同时间更新的客户资料):先筛选出需要保留的版本,再去重
示例(假设客户表有update_time字段代表资料更新时间,保留最新版本):
df2_latest = df2.sort_values('update_time', ascending=False).drop_duplicates(subset='Id_Customer', keep='first') - 第三步:重新执行左关联
# 用处理后的无重复客户表和销售表关联,结果行数会和销售表df1的行数完全一致 data_sum = df1.merge(df2_unique, on='Id_Customer', how='left')
附加校验项
如果处理后仍有异常,先检查两个表关联键的数据类型是否一致,避免隐式匹配错误:
# 查看两个表关联键的类型 print(df1['Id_Customer'].dtype) print(df2['Id_Customer'].dtype) # 若类型不一致,统一转为字符串类型后再关联 df1['Id_Customer'] = df1['Id_Customer'].astype(str) df2_unique['Id_Customer'] = df2_unique['Id_Customer'].astype(str)
内容的提问来源于stack exchange,提问作者Guaraci Falcão
相关产品推荐
相关产品推荐

