如何通过列表批量累加多个Pandas DataFrame的对应值?
批量累加多个DataFrame的高效实现方案
你可以用和批量merge类似的思路来实现多个DataFrame的数值累加,这里提供两种实用的方法,都能替代你原来的逐个add操作,而且可以轻松扩展到3个以上的DataFrame:
方法1:用functools.reduce实现(和批量merge逻辑对齐)
和你用reduce处理merge的思路完全一致,我们只需要把合并操作换成DataFrame的add方法,同时通过fill_value=0来处理缺失的行(避免缺失值变成NaN):
步骤1:统一处理索引(更高效)
先给所有DataFrame设置共同的索引列,避免重复操作:
import pandas as pd from functools import reduce # 假设已经读取好data0、data1、data2 data_list = [df.set_index(['player_id', 'player_name']) for df in [data0, data1, data2]]
步骤2:用reduce批量累加
# 用reduce逐个累加所有DataFrame final_data = reduce(lambda left, right: left.add(right, fill_value=0), data_list) # 恢复索引并转换为整数类型(和你的需求对齐) final_data = final_data.astype(int).reset_index()
如果你不想提前统一设置索引,也可以把索引操作放到reduce的lambda函数里(效率稍低,但代码更紧凑):
data_list = [data0, data1, data2] final_data = reduce( lambda left, right: left.set_index(['player_id', 'player_name']) .add(right.set_index(['player_id', 'player_name']), fill_value=0) .reset_index(), data_list ).astype(int)
方法2:用concat + groupby求和(更直观)
另一种更易读的方法是先把所有DataFrame纵向拼接,再按分组键求和,逻辑更清晰:
import pandas as pd data_list = [data0, data1, data2] # 拼接所有DataFrame combined_df = pd.concat(data_list) # 按player_id和player_name分组,对数值列求和 final_data = combined_df.groupby(['player_id', 'player_name']).sum().astype(int).reset_index()
结果验证
两种方法都会生成你期望的final_data,比如:
- S. Smith的
ab列会是0+1+1=2,run列是0+4+9=13,hit列是0+6+2=8 - J.J. Hardy的
hit列是0+10+5=15
完全匹配你给出的目标结果。
内容的提问来源于stack exchange,提问作者michael0196
相关产品推荐
相关产品推荐

