Pandas合并DataFrame时将多匹配值合并至单个字段的方法
解决Pandas合并后A+ID组合重复、多值合并的问题
嘿,这个场景我太熟悉了!当用pd.merge做左连接遇到一对多匹配时,确实会出现A和ID组合重复的情况,想要保留唯一组合并把多匹配的values合并到单个字段,用分组聚合就能轻松解决,我给你两种常用的实现方式,还有更高效的优化方案:
先明确问题场景
先把你的原始数据和合并后的问题复现出来,方便理解:
import pandas as pd df1 = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'ID']) df2 = pd.DataFrame([[3, 2], [3, 3], [4, 6]], columns=['ID', 'values']) # 执行左连接后的结果,确实存在重复行 merged_df = pd.merge(df1, df2, on="ID", how="left") print(merged_df)
输出结果:
A ID values
0 1 2 NaN
1 1 3 2.0
2 1 3 3.0
3 4 6 6.0
可以看到A=1、ID=3的组合出现了两次,对应两个不同的values值。
方案1:合并后分组聚合(直观易理解)
这种方式先完成合并,再对A和ID分组,把同一组的values合并成你需要的格式:
方式1.1:合并为逗号分隔的字符串
适合需要把多值展示为文本的场景:
# 分组后用逗号连接非空的values result_str = merged_df.groupby(['A', 'ID'])['values'].agg( lambda x: ','.join(x.dropna().astype(str)) ).reset_index() # 把空字符串替换为pd.NA(可选,根据你的需求调整) result_str['values'] = result_str['values'].replace('', pd.NA) print(result_str)
输出结果:
A ID values
0 1 2
1 1 3 2,3
2 4 6 6
方式1.2:保留为列表格式
适合后续还需要对多值进行处理的场景,灵活性更高:
# 分组后把非空values转为列表 result_list = merged_df.groupby(['A', 'ID'])['values'].agg( lambda x: x.dropna().tolist() ).reset_index() print(result_list)
输出结果:
A ID values
0 1 2 []
1 1 3 [2, 3]
2 4 6 [6]
方案2:先聚合df2再合并(更高效)
如果你的数据量比较大,先对df2按ID聚合再合并,能避免中间生成大量重复行,性能更好:
# 先对df2的values按ID聚合(这里用逗号分隔字符串为例,也可以换成列表) df2_agg = df2.groupby('ID')['values'].agg( lambda x: ','.join(x.astype(str)) ).reset_index() # 再和df1做左连接 result_efficient = pd.merge(df1, df2_agg, on="ID", how="left") print(result_efficient)
输出结果和方案1.1完全一致,但是处理大数据集时速度会快很多。
内容的提问来源于stack exchange,提问作者SLglider
相关产品推荐
相关产品推荐

