Pandas中Series与DataFrame减法运算出现全NaN结果的原因及运算步骤咨询
Pandas中Series与DataFrame减法运算出现全NaN结果的原因及运算步骤咨询
嘿,这个问题其实是Pandas里很典型的索引对齐机制导致的,我来一步步给你拆解清楚:
首先先还原你的运算对象,先看两个参与减法的部分:
先看
df.max(axis=1)的结果:
这是一个Series,它的索引是原DataFrame的行索引(0和1),值是每行的最大值,输出是这样的:0 4 1 9 dtype: int64注意这个Series只有行索引,没有列标签。
再看
df[['b']]的结果:
这是一个DataFrame,它的行索引也是0和1,但列只有一个'b',输出是:b 0 1 1 6
接下来就是关键的运算步骤了,Pandas的算术运算核心是索引对齐,规则是这样的:
当Series和DataFrame做运算时,默认会把Series的索引和DataFrame的列索引去匹配对齐。如果两者的索引没有重叠,那所有位置都找不到可以匹配计算的值,结果就全是NaN了。
具体到你的例子:
- Series的索引是
[0,1],DataFrame的列索引是['b'],完全没有交集 - Pandas会生成一个包含两者索引并集的结果DataFrame(列是
['b',0,1],行是[0,1]),每个位置只有在两个原对象中都有对应值时才会计算,否则就填充NaN - 因为没有任何匹配的索引,所以最终结果就是全NaN的DataFrame,也就是你看到的:
b 0 1 0 NaN NaN NaN 1 NaN NaN NaN
如果想要实现“每行最大值减去该行的b列值”的预期效果,你可以指定按行索引对齐,比如用sub方法并指定axis=0:
df.max(axis=1).sub(df['b'], axis=0)
或者把Series转换成和DataFrame同形状的二维数组再运算:
df.max(axis=1).values[:, None] - df[['b']]
这样就能得到正确的结果:
b 0 3 1 3
备注:内容来源于stack exchange,提问作者Lei Hao
相关产品推荐
相关产品推荐

