pandas DataFrame设置列名后iloc乘法出现NaN的原因及解决方法
原因分析
pandas中DataFrame与Series执行算术运算时,默认会将Series的索引与DataFrame的列索引做对齐匹配,匹配不到的位置就会返回NaN:
- test1中
df.iloc[:, 0:3]的列索引是整数[0,1,2],和df['Count']这个Series的行索引(0~9的连续整数)恰好能匹配到前3个值,所以巧合返回了符合预期的有效值,本质上这种写法的逻辑也是不严谨的。 - test2中
df.iloc[:, 0:3]的列索引是字符串['find','a','b'],和df['Count']的整数行索引完全无法匹配,所以运算后全部返回NaN。
第二段代码修改方案
你只需要指定运算时Series沿列方向对齐(也就是匹配行索引,沿列广播)即可,有两种常用改法:
- 显式指定乘的方向,用
pandas.DataFrame.mul的axis参数:
df.iloc[:, 0:3] = df.iloc[:, 0:3].mul(df['Count'], axis=0)
- 直接取Series的numpy数组运算,跳过索引对齐逻辑:
df.iloc[:, 0:3] *= df['Count'].values
是否需要始终用mul方法
不需要强制所有场景都用mul,但建议符合以下任意一种情况时优先用mul/add这类显式算术方法:
- 需要控制对齐规则、广播方向时
- 列索引/行索引存在类型、命名不一致的可能时
- 代码需要更高可读性、可维护性时
如果你的操作完全是按位置运算、不需要索引对齐,直接用.values取数组运算也非常高效。
内容的提问来源于stack exchange,提问作者sam_doggy
相关产品推荐
相关产品推荐

