pandas使用.loc赋值时非预期行被修改的原因及解决方法
问题原因
pandas的.loc针对行的整数索引切片遵循左右端点均包含的规则,和Python原生列表左闭右开的切片逻辑不同:
- 你代码中写的
df.loc[0:2, ["col2", "col3"]]实际选中了索引为0、1、2的3行(对应A、B、C三行),这是C行被意外修改的核心原因 - 同时右侧的源数据
df.loc[2:4, ["col2", "col3"]]也选中了索引为2、3、4的3行,赋值时3行数据刚好对应覆盖左侧3行,C行就被源数据中E行的数值覆盖了。
解决方法
只要保证左侧选中的行数和你预期修改的行数(2行)匹配即可,有两种常用写法:
方法1:调整.loc的切片范围
把左侧的切片调整为0:1(包含索引0、1,共2行),右侧源数据调整为2:3(包含索引2、3,共2行):
df.loc[0:1, ["col2", "col3"]] = df.loc[2:3, ["col2", "col3"]].values
方法2:使用.iloc避免切片规则混淆
如果更习惯Python原生左闭右开的切片逻辑,可以用.iloc按位置选取:
# iloc左闭右开,0:2对应第0、1个位置的行,2:4对应第2、3个位置的行,刚好2行匹配 df.iloc[0:2, [1,2]] = df.iloc[2:4, [1,2]].values
两种写法运行后都能得到你预期的结果。
内容的提问来源于stack exchange,提问作者Rob Creel
相关产品推荐
相关产品推荐

