DataFrame过滤赋值列遇SettingWithCopyWarning及X_test未更新求助
解决Pandas的SettingWithCopyWarning问题及字段未更新问题
你碰到的这个警告和字段没更新的问题,本质是链式索引导致的副本/视图混淆。Pandas没法确定你连续两次索引操作后,到底是在修改原DataFrame还是它的临时副本,所以既给了你警告,你的赋值操作也没作用到原数据上。
先说说你两种写法的问题:
- 第一种
X_test[X_test['country']=='US'].loc[:,'country_US']=1:先通过X_test[X_test['country']=='US']切片得到的可能是原数据的副本,后续用loc赋值只是修改了这个临时副本,原X_test自然没变化。 - 第二种
X_test.loc[X_test['country']=='US'].loc[:,'country_US']=1:哪怕用了loc,连续两次链式调用loc还是会触发同样的问题,第一次loc返回的结果依然可能是副本,赋值操作没传递到原数据。
正确的写法(一次定位完成赋值)
直接用单次loc同时定位行和列,这是Pandas官方推荐的避免链式索引问题的方式,既能正确修改原数据,也不会触发警告:
X_test.loc[X_test['country'] == 'US', 'country_US'] = 1
补充:如果country_US列还未创建
要是你的X_test里还没有country_US这个字段,记得先初始化列(比如默认设为0),再赋值:
# 先创建列,默认值为0 X_test['country_US'] = 0 # 给符合条件的行赋值1 X_test.loc[X_test['country'] == 'US', 'country_US'] = 1
内容的提问来源于stack exchange,提问作者illla
相关产品推荐
相关产品推荐

