You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中Series与DataFrame减法运算出现全NaN结果的原因及运算步骤咨询

Pandas中Series与DataFrame减法运算出现全NaN结果的原因及运算步骤咨询

嘿,这个问题其实是Pandas里很典型的索引对齐机制导致的,我来一步步给你拆解清楚:

首先先还原你的运算对象,先看两个参与减法的部分:

  1. 先看df.max(axis=1)的结果:
    这是一个Series,它的索引是原DataFrame的行索引(0和1),值是每行的最大值,输出是这样的:

    0    4
    1    9
    dtype: int64
    

    注意这个Series只有行索引,没有列标签。

  2. 再看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:04:50