为何从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
相关产品推荐
相关产品推荐

