Pandas Series赋值同对象其他索引值时出现NaN的原因
问题原因
出现赋值后得到NaN的核心原因是Pandas的索引对齐机制:所有Series、DataFrame之间的赋值、运算操作,Pandas默认按索引标签匹配数据,而非按元素的物理位置顺序匹配。
两种操作场景的差异:
- 对切片做数值计算、赋值标量时:
x[['a','b']]/2的计算结果保留原切片的索引['a','b'],和赋值目标的索引完全一致,可正常赋值;标量无索引,会直接广播到所有目标位置,不存在匹配问题。 - 用同Series其他切片赋值时:
x[['c','d']]返回的Series索引为['c','d'],而赋值目标位置的索引是['a','b'],两边索引无重叠匹配项,Pandas无法找到对应赋值内容,就会在目标位置填充NaN。
按位置赋值的正确写法
如果需要忽略索引、按元素位置顺序赋值,可以选以下两种常用方案:
- 取右侧切片的
.values属性(即底层NumPy数组),绕开索引对齐逻辑:
import pandas as pd x = pd.Series([1.1, 2.2, 3.4, 5.6], ['a', 'b', 'c', 'd']) x[['a', 'b']] = x[['c', 'd']].values print(x)
运行结果:
a 3.4 b 5.6 c 3.4 d 5.6 dtype: float64
- 用
.iloc做纯位置索引切片,全程不依赖标签匹配:
import pandas as pd x = pd.Series([1.1, 2.2, 3.4, 5.6], ['a', 'b', 'c', 'd']) # 位置0、1对应标签a、b,位置2、3对应标签c、d x.iloc[:2] = x.iloc[2:] print(x)
运行结果和上述方案一致。
内容的提问来源于stack exchange,提问作者Timespace
相关产品推荐
相关产品推荐

