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

为何从DataFrame同一列的一部分减去另一部分会返回全NaN的同长Series

为何从DataFrame同一列的一部分减去另一部分会返回与原列长度相同的全NaN Series?

复现代码(Pandas 1.4.2,Python 3.9)

import pandas as pd

df = pd.DataFrame(
    {
        'half': ['first half', 'first half', 'second half', 'second half'],
        'vals': [10, 10, 5, 5]
    }
)
first_half_s = df.loc[df['half'] == 'first half']['vals']
second_half_s = df.loc[df['half'] == 'second half']['vals']

diff_s = first_half_s - second_half_s
# 输出结果:
# 0   NaN
# 1   NaN
# 2   NaN
# 3   NaN
# dtype: float64

核心原因:Pandas的索引对齐机制

Pandas中对Series执行算术运算时,会优先根据索引值进行匹配,只有索引完全一致的位置才会执行运算,无匹配的位置自动填充NaN。

具体到你的代码:

  • first_half_s的索引是[0, 1](继承自原DataFrame的前两行索引);
  • second_half_s的索引是[2, 3](继承自原DataFrame的后两行索引);
  • 两个Series没有任何重叠的索引值,因此运算后Pandas会合并两者的索引得到[0,1,2,3],每个索引位置都找不到对应匹配的运算对象,最终返回全NaN的Series。

验证:重置索引后运算正常

如果重置两个Series的索引,让它们拥有相同的索引值,运算就会正常执行:

first_half_s_reset = first_half_s.reset_index(drop=True)
second_half_s_reset = second_half_s.reset_index(drop=True)
diff_s = first_half_s_reset - second_half_s_reset
# 输出结果:
# 0    5
# 1    5
# dtype: int64

内容的提问来源于stack exchange,提问作者whaddaplaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:12