You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:44:34