Pandas中用loc修改DataFrame指定行列值失败,求解决方案
解决Pandas DataFrame行列值替换失败的问题
先还原你的问题场景:
我尝试将pandas DataFrame中第0行20至71列的值替换为第1行对应列的值,使用
sub_data.loc[[0],20:71] = sub_data.loc[1,20:71]或sub_data.loc[0,20:71] = sub_data.loc[1,20:71]两种方式均未成功,请问有什么解决建议?
为什么loc赋值会失效?
这两种方式没生效,大概率是Pandas的索引对齐机制在搞鬼。当你用loc赋值时,右侧返回的是带列索引的Series,Pandas会自动尝试按列索引匹配赋值位置。如果你的DataFrame列索引不是连续整数(比如有缺失、是字符串类型),或者赋值过程触发了隐性的SettingWithCopyWarning(比如操作的是原DataFrame的切片副本),就会导致赋值没真正作用到原DataFrame上。
可行的解决方法
1. 你已经验证有效的方法:iloc.update()
iloc是纯位置索引,完全绕开了索引对齐的问题,update()方法会直接按位置把右侧的值覆盖到左侧,非常稳妥:
sub_data.iloc[0,20:71].update(sub_data.iloc[1,20:71])
2. 跳过索引对齐的loc赋值
如果还是想用loc,可以把右侧的Series转成numpy数组,这样Pandas就不会做索引对齐,直接按位置赋值:
sub_data.loc[0, 20:71] = sub_data.loc[1, 20:71].values
3. 直接用iloc赋值
同样基于位置索引,只要左右两侧形状匹配,直接赋值也能生效:
sub_data.iloc[0, 20:71] = sub_data.iloc[1, 20:71].values
内容的提问来源于stack exchange,提问作者Medhat
相关产品推荐
相关产品推荐

