You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:27:03