如何对多个列数一致、行数不同的动态DataFrame逐单元格叠加求和?
实现方案
所有动态生成的待求和DataFrame统一存入列表dfs,无需单独定义每个变量,完全适配动态场景。
前置依赖
import pandas as pd import numpy as np
完整代码逻辑
# 自动计算所有输入表的最大行数,列数全表一致无需额外处理 max_rows = max(df.shape[0] for df in dfs) col_count = dfs[0].shape[1] # 初始化全零累加容器 total_arr = np.zeros((max_rows, col_count), dtype=np.float64) # 逐表累加 for df in dfs: # 空值填充为0,避免NaN污染求和结果 current_arr = df.fillna(0).values curr_rows, curr_cols = current_arr.shape # 仅累加当前表存在的区域,自动对齐物理位置 total_arr[:curr_rows, :curr_cols] += current_arr # 转换为最终DataFrame,列名沿用第一个输入表的列名 result = pd.DataFrame(total_arr, columns=dfs[0].columns)
逻辑说明
- 完全按物理位置逐单元格累加,和你提到的
Result[1,1] = Table1[1,1] + Table2[1,1]对齐逻辑一致,不受原有行、列标签影响。 - 自动匹配最大尺寸,结果行数为所有输入表的最大行数,列数与输入表完全一致。
- 空值自动按0处理,仅累加对应位置存在的有效数据。
- 无硬编码内容,仅需将所有动态生成的表放入
dfs列表即可直接复用。
如果不需要保留原列名,仅按位置生成结果,可将最后一行简化为result = pd.DataFrame(total_arr)。
备选pandas原生实现
如果希望纯用pandas API完成逻辑,可使用functools.reduce迭代求和,结果与上述方案完全一致:
from functools import reduce # 重置所有表的索引为位置索引,避免原有行标签干扰对齐逻辑 reset_dfs = [df.reset_index(drop=True) for df in dfs] # 逐表累加,缺失单元格自动填0 result = reduce(lambda left, right: left.add(right, fill_value=0), reset_dfs)
内容的提问来源于stack exchange,提问作者LBZR
相关产品推荐
相关产品推荐

