Pandas触发SettingWithCopyWarning切片赋值告警的解决方法咨询
问题原因解释
SettingWithCopyWarning警告的触发逻辑为:你当前操作的df_data大概率是此前从其他DataFrame通过切片、过滤等操作生成的对象,pandas无法确定该对象是指向原数据的视图还是独立的内存副本。你使用的df_data['area'][i]属于链式索引操作,赋值行为的结果不可控:有可能只修改了副本未影响原数据,也有可能直接修改了原数据,不符合预期行为的风险较高,因此pandas抛出该警告做提醒。
修改操作的最佳实践
- 优先替换链式索引写法,使用pandas官方推荐的
.loc(按标签索引)或.iloc(按位置索引)访问器完成单值赋值,示例如下:
按标签索引写法:
按位置索引写法:df_data.loc[i, 'area'] = test.loc[i, 'area']# 先获取area列对应的位置序号 col_idx = df_data.columns.get_loc('area') test_col_idx = test.columns.get_loc('area') df_data.iloc[i, col_idx] = test.iloc[i, test_col_idx] - 如果
df_data本身就是你需要独立操作、不需要同步到原DataFrame的对象,在创建df_data时主动调用.copy()方法显式声明为独立副本,从根源避免警告触发,示例如下:# 假设你此前是通过过滤得到df_data df_data = original_df[original_df['status'] == 1].copy()
抑制警告的方法
非必要不建议直接抑制警告,该提示可以帮助你规避很多隐性的赋值错误,如果确认自己的操作逻辑无误,可以通过以下两种方式关闭提示:
- 局部关闭(推荐):仅关闭指定代码块的警告,不影响全局配置
import pandas as pd with pd.option_context('mode.chained_assignment', None): # 在此处写会触发警告的代码 df_data['area'][i] = test['area'][i] - 全局关闭:整个运行周期内都不再触发该类警告
import pandas as pd pd.set_option('mode.chained_assignment', None)
如果需要将该警告升级为错误方便调试,可以把上述配置参数替换为'raise'。
内容的提问来源于stack exchange,提问作者user297850
相关产品推荐
相关产品推荐

