pandas中列不同的两个DataFrame按对齐规则相加的实现方法
问题分析
现有代码存在三个明显问题:
- 多余的
reset_index操作:原本dt1、dt2的行索引已经符合要求的['Sun', 'Wind', 'Water', 'Flow'],reset_index会把行索引转为普通列,同时将0/1/2/3设为新的默认行索引,增加不必要的处理成本。 - 相加逻辑错误:先执行加法再调用
fillna(0),会把仅存在于单个DataFrame的列的原始值全部覆盖为0,不符合「仅在单个df存在的列直接保留取值」的要求。 - 样例数据生成bug:你生成
dt1、dt2时传入的rows只有1行,虽然pandas会自动广播匹配4行索引,但写法不严谨,容易引发预期外的结果。
正确实现方案
核心使用pandas自带的add方法,指定fill_value=0即可满足全部需求,不需要手动写双重循环。
import pandas as pd # 生成dt1 cols1 = range(1, 20) idx = ['Sun', 'Wind', 'Water', 'Flow'] row = [0] * len(cols1) dt1 = pd.DataFrame([row]*len(idx), index=idx, columns=cols1) # 生成dt2 cols2 = range(3, 22) row = [0] * len(cols2) dt2 = pd.DataFrame([row]*len(idx), index=idx, columns=cols2) # 核心相加逻辑,自动对齐行列,符合需求 res_df = dt1.add(dt2, fill_value=0) # 可选补充:如果需要严格保证列范围是1-22,即使两个输入df都没有某列也补0,添加下行 res_df = res_df.reindex(columns=range(1,23), fill_value=0)
逻辑说明
- pandas的
DataFrame.add方法默认会自动对齐行索引和列名,刚好匹配你「同名列按行列位置对应相加」的要求,相同行索引、相同列名的位置会自动对应相加。 fill_value=0参数表示,当某列/某行只在其中一个DataFrame中存在时,缺失的取值用0填充后再执行加法,等价于直接保留仅在单个DataFrame中存在的列的原始值。- 可选的
reindex操作用于严格约束最终输出的列范围为1到22,你可以根据实际需求决定是否保留。
内容的提问来源于stack exchange,提问作者Parwez Noori
相关产品推荐
相关产品推荐

