如何按iloc而非索引对两个Pandas Series做减法并保留指定索引
按位置而非索引对Series进行减法运算
这个问题很典型——pandas默认的算术运算都是按索引对齐的,所以直接a - b会把相同索引的元素相减,没有匹配的就返回NaN,这就是你看到的结果。要实现按位置(iloc对应的位置)相减,同时保留原Series的索引,有几种简单的方法:
方法1:直接操作数值数组(最简洁)
利用Series的values属性获取底层的numpy数组,数组运算会严格按位置对应,之后再用原Series的索引重新构造结果:
import pandas as pd a = pd.Series([1,2,3],index=[1,2,3]) b = pd.Series([2,3,4],index=[2,3,4]) result = pd.Series(a.values - b.values, index=a.index) print(result)
输出:
1 -1 2 -1 3 -1 dtype: float64
方法2:重置索引后运算(更贴合pandas风格)
先把两个Series的索引都重置为默认的0-based索引,这样运算时就会按位置对齐,最后再把结果的索引改回原Series的索引:
result = (a.reset_index(drop=True) - b.reset_index(drop=True)).set_axis(a.index) print(result)
这个方法避免直接操作numpy数组,完全用pandas的API实现,适合习惯pandas操作逻辑的场景。
为什么直接a - b得不到预期结果?
再补充下原因:pandas的核心设计之一就是索引对齐,当你对两个Series做算术运算时,它会先匹配两者的索引标签,只有索引相同的元素才会进行运算,没有匹配的位置就填充NaN。所以你的例子里,a的索引1在b中不存在,b的索引4在a中不存在,这些位置就返回NaN,而索引2、3的元素因为索引匹配,所以是2-2=0、3-3=0。
内容的提问来源于stack exchange,提问作者Him
相关产品推荐
相关产品推荐

