Pandas中直接用+相加遇NaN会传播而非跳过,需用fillna(0)或add(fill_value=0)处理;索引不对齐时+更严格,add更可控;含NaN整数列自动转float64,可用'Int64'保持整型语义。
![pandas怎么两列相加_直接使用加号df[\'c\']=df[\'a\']+df[\'b\']算术运算](https://img.php.cn/upload/article/000/969/633/177379489125050.png)
直接用 + 相加会出 NaN?先看空值怎么处理
只要 A 或 B 任意一个位置是 NaN,df['A'] + df['B'] 的结果在那一行就是 NaN——这是 Pandas 默认行为,不是 bug,但常被当成“加法失效”。
- 默认加法不跳过
NaN,而是传播它(类似 NumPy) - 如果想把
NaN当 0 加,得显式填充:df['A'].fillna(0) + df['B'].fillna(0) - 如果只想保留两个都不为空的行,用
df['A'].add(df['B'], fill_value=0)更稳——add()支持fill_value参数,且对齐逻辑更可控
add() 和 + 看似一样,实际对齐逻辑不同
当两列索引不完全一致(比如有缺失行、顺序乱、或来自不同 DataFrame 合并后),+ 和 add() 表现不一样。
-
df['A'] + df['B']是按索引严格对齐:索引不匹配的位置直接产出NaN -
df['A'].add(df['B'])也是对齐,但支持fill_value,比如.add(df['B'], fill_value=0)能让缺失索引处按 0 参与运算 - 如果你刚
merge过数据,发现相加后大片NaN,大概率是索引没对上,别急着填空,先print(df.index)看一眼
整数列含 NaN 时,类型会自动变成 float64
Pandas 不允许整数型 Series 存 NaN,所以一旦原始列 A 或 B 里有空值,相加后结果列类型必为 float64,哪怕所有值都是整数。
- 这不是错误,是设计使然;强行转
int会报ValueError: cannot convert float NaN to integer - 如果业务上必须整型输出,得先决定
NaN怎么处理:丢弃(.dropna())、填 0(.fillna(0).astype(int))、或用可空整型(.astype('Int64'),注意是大写 I) -
'Int64'是 Pandas 的 nullable integer 类型,能存NaN且保持整数语义,但部分老版本不支持
性能差异小,但链式操作里 add() 更可靠
单次相加,+ 和 .add() 速度几乎没差别。但在复杂表达式里,.add() 的参数控制能力减少意外。
- 比如要加三列并统一把空值当 -1:
df['A'].add(df['B'], fill_value=-1).add(df['C'], fill_value=-1) - 而用
+就得写三遍fillna(-1),还容易漏掉某一个 - 再比如做广播加法(一列加一个标量),
df['A'] + 5和df['A'].add(5)效果相同,但后者语义更明确,尤其在 pipeline 中可读性更好
df['C'] = df['A'] + df['B'] 就可能埋下后面两小时 debug 的坑。










