如何用Pandas合并多个DataFrame并累加重复键对应的值?
Pandas合并重复键DataFrame并累加值的高效方法
当然有更简洁高效的Pandas方案!你已经用到了pd.concat(dfs)来合并多个DataFrame,其实在此基础上,直接用groupby配合聚合函数就能一步完成重复键的值累加,完全不用手动处理重复项或者逐行遍历——这也是Pandas处理这类场景的标准做法。
核心思路
- 合并所有DataFrame:先用
pd.concat()把多个待合并的DataFrame拼接成一个大的DataFrame,这一步你已经尝试过了。 - 按键分组并累加:以你的重复键(比如
ID)为分组依据,对需要累加的列使用sum()聚合函数,Pandas会自动将相同键的行合并,并把对应数值列的值累加起来。
示例代码
先创建几个测试用的DataFrame:
import pandas as pd # 示例DataFrame df1 = pd.DataFrame({'ID': [1, 2, 3], 'Score': [85, 90, 78]}) df2 = pd.DataFrame({'ID': [2, 3, 4], 'Score': [5, 12, 92]}) df3 = pd.DataFrame({'ID': [1, 4], 'Score': [10, 8]})
然后执行合并和累加操作:
# 合并所有DataFrame combined_df = pd.concat([df1, df2, df3]) # 按ID分组,累加Score列,同时保留ID为列(as_index=False) master_df = combined_df.groupby('ID', as_index=False).sum() print(master_df)
输出结果:
ID Score 0 1 95 1 2 95 2 3 90 3 4 100
处理混合类型列的情况
如果你的DataFrame里既有需要累加的数值列,又有需要保留特定值的非数值列(比如分类标签),可以用agg()函数自定义每列的处理逻辑:
# 带分类列的示例DataFrame df1 = pd.DataFrame({'ID': [1, 2], 'Score': [85, 90], 'Class': '一班'}) df2 = pd.DataFrame({'ID': [2, 3], 'Score': [5, 12], 'Class': '二班'}) combined_df = pd.concat([df1, df2]) master_df = combined_df.groupby('ID', as_index=False).agg( Score=('Score', 'sum'), # 累加分数 Class=('Class', 'first') # 保留第一个出现的班级 ) print(master_df)
输出结果:
ID Score Class 0 1 85 一班 1 2 95 一班 2 3 12 二班
为什么这个方法更好?
相比你提到的手动处理重复项或者逐行遍历,groupby是Pandas底层优化过的操作,在数据量较大时性能优势非常明显,而且代码更简洁易读,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

