如何对任意数量的pandas DataFrame按行列匹配逐元素相加?
实现多个Pandas DataFrame按行列匹配逐元素相加(缺失值视为0)
方法1:使用pd.concat + groupby求和
这种方法逻辑直观,适合任意数量的DataFrame:先将所有DataFrame按行索引堆叠,再按行列索引分组求和,缺失的行列会自动以0参与计算(sum()默认跳过NaN,等价于视为0)。
代码示例:
import pandas as pd dat1 = pd.DataFrame({'A' : [1999, -11234], 'B' : [88888, -345], 'C' : [-7777, -8978], 'D' : [7777, -8978]}) dat2 = pd.DataFrame({'A' : [999, 1234], 'B' : [8888, -345], 'C' : [-7777, -8978]}) Collection = [dat1, dat2] # 合并所有DataFrame并按行索引分组求和 result = pd.concat(Collection).groupby(level=0).sum() print(result)
输出结果:
A B C D 0 2998 97776 -15554 7777 1 -10000 -690 -17956 -8978
方法2:使用functools.reduce + DataFrame.add
通过reduce迭代调用add方法,设置fill_value=0让缺失的行列自动填充0后再相加,效率更高,适合大规模数据场景。
代码示例:
import pandas as pd from functools import reduce dat1 = pd.DataFrame({'A' : [1999, -11234], 'B' : [88888, -345], 'C' : [-7777, -8978], 'D' : [7777, -8978]}) dat2 = pd.DataFrame({'A' : [999, 1234], 'B' : [8888, -345], 'C' : [-7777, -8978]}) Collection = [dat1, dat2] # 迭代相加,缺失值填充0 result = reduce(lambda x, y: x.add(y, fill_value=0), Collection) print(result)
输出与方法1完全一致。
方法说明
- 方法1核心:
concat堆叠所有DataFrame,groupby(level=0)保留原行索引,sum()自动忽略NaN(等价于视为0); - 方法2核心:
reduce依次将列表中DataFrame两两相加,add(fill_value=0)确保缺失的行/列用0补充,避免出现NaN; - 两种方法均支持任意数量的DataFrame,无论行/列是否完全匹配。
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

