Pandas合并三个客户数据集并按字段匹配去重的问题
拼接逻辑错误原因
pd.concat([df2,df1,df3], axis=1)是按行索引对齐的横向硬拼接,完全不会识别三个数据集里的客户对应关系,直接把三个表同一行号的内容拼在一起,会出现客户和Age、Exposures字段完全错位的问题,不符合你按客户ID关联的需求。- 三个表的客户主键字段名不统一:dataset2的主键是
Customer,dataset1、dataset3的客户字段是Customer1、Customer2,concat不会处理字段名差异做关联匹配,自然无法拿到对应客户的Age字段。 - concat本身不具备按指定字段去重合并客户的能力,只会把所有行的内容直接堆叠,无法得到你要的无重复客户结果。
正确实现方案
步骤1:合并dataset1、dataset3并去重
两个表结构完全一致,先纵向拼接后按Customer1、Customer2去重:
# 纵向合并df1和df3的所有行 df_13_raw = pd.concat([df1, df3], axis=0, ignore_index=True) # 按Customer1、Customer2组合去重,保留第一条出现的记录 df_13_unique = df_13_raw.drop_duplicates(subset=['Customer1', 'Customer2'], keep='first')
步骤2:关联dataset2的Age字段
根据你的需求选择匹配逻辑:
仅给Customer1匹配Age(Exposures对应Customer1的场景)
result = df_13_unique.merge( df2, left_on='Customer1', # df1、df3中Customer1的字段名 right_on='Customer', # df2中客户ID的字段名 how='left' # 保留df1+df3的所有客户,匹配不到的Age返回空值 ) # 可选:删除重复的Customer字段 result = result.drop(columns=['Customer'])
同时给Customer1、Customer2都匹配Age
# 先匹配Customer1的Age,重命名避免冲突 result = df_13_unique.merge( df2, left_on='Customer1', right_on='Customer', how='left' ).rename(columns={'Age': 'Age_Customer1'}).drop(columns=['Customer']) # 再匹配Customer2的Age result = result.merge( df2, left_on='Customer2', right_on='Customer', how='left' ).rename(columns={'Age': 'Age_Customer2'}).drop(columns=['Customer'])
内容的提问来源于stack exchange,提问作者LdM
相关产品推荐
相关产品推荐

