Pandas中将DataFrame列叠加到另一DataFrame指定列出现NaN问题排查
问题根源
你遇到的异常是Pandas算术运算的默认索引对齐规则导致的:
当你对DataFrame类型(你用iloc[:, [x]]带方括号取列得到的是单列DataFrame)和Series类型做算术运算时,Pandas默认会用Series的索引匹配DataFrame的列索引,再沿行方向广播计算,匹配不到的位置就会返回NaN。
对应你第二个测试案例的现象可以完全对应上:
- 你用来叠加的
overlay.iloc[:, 0]是Series,索引为[0,1,2,3,4,5,6],对应值为[0,0,0,0,6,6,0] - 你选中的
data.iloc[:, [1,2,4,5,7,8]]是列索引为[1,2,4,5,7,8]的DataFrame - 运算时的匹配逻辑:
- 列1匹配到Series索引为1的值0 → 整列加0,无变化
- 列2匹配到Series索引为2的值0 → 整列加0,无变化
- 列4匹配到Series索引为4的值6 → 整列加6,所有行数值都被修改
- 列5匹配到Series索引为5的值6 → 整列加6,所有行数值都被修改
- 列7、8在Series的索引中不存在 → 匹配失败,整列填充NaN
解决方案
有两种常用的方法可以实现按行对齐叠加的需求:
方法1:转numpy数组抹掉索引(最简单高效)
直接把右侧的Series转为numpy数组,去掉索引信息,Pandas就会按位置逐行对应叠加:
# 单列表加示例 b.iloc[:, [1]] += a.iloc[:, 0].values # 多列叠加示例 data.iloc[:, [1,2,4,5,7,8]] += overlay.iloc[:, 0].values
方法2:用add方法指定对齐轴
调用DataFrame的add方法,指定axis=0,表示按行索引匹配叠加:
# 单列表加示例 b.iloc[:, [1]] = b.iloc[:, [1]].add(a.iloc[:, 0], axis=0) # 多列叠加示例 data.iloc[:, [1,2,4,5,7,8]] = data.iloc[:, [1,2,4,5,7,8]].add(overlay.iloc[:, 0], axis=0)
两种方法都可以得到你预期的逐行叠加结果。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

