用Pandas多列除以另一列结果全为NaN,原因何在?
问题原因及解决方案
核心原因:Pandas的索引对齐机制
当你执行df[["b", "c"]] / df["a"]时,Pandas默认会按照列索引进行对齐运算:
df[["b", "c"]]是列索引为["b", "c"]的DataFramedf["a"]是行索引为[0]的Series,在与DataFrame运算时,Pandas会把这个Series的行索引标签当作列名去匹配DataFrame的列
因为两者的索引标签完全不匹配(DataFrame没有名为0的列,Series也没有对应b、c的索引),所以运算后所有位置都返回NaN,同时Pandas会把Series的索引标签0作为新列加入结果,就出现了你看到的三列全NaN的情况。
解决方法
有几种简单的方式可以实现你预期的逐行除法:
- 转为numpy数组跳过索引对齐
把df["a"]转为numpy数组,这样Pandas会直接按元素广播运算,忽略索引:
df[["b", "c"]] / df["a"].values
输出:
b c 0 2.0 3.0
- 指定按行对齐运算
使用div()方法并设置axis=0,明确告诉Pandas按行索引对齐,让每行的b、c值除以该行的a值:
df[["b", "c"]].div(df["a"], axis=0)
同样能得到正确的运算结果。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

