过滤更新Pandas DataFrame时触发SettingWithCopyWarning的解决方法
解决Pandas SettingWithCopyWarning的最佳实践
警告原因
你遇到的SettingWithCopyWarning,本质是因为用df[df['Temperature'] < 20]筛选得到的cold_cities可能是原DataFrame的视图(不是独立的副本)。这时候修改这个切片,Pandas无法确定你是想修改原数据还是仅修改切片,容易引发不可预测的结果,所以抛出警告。
两种可靠解决方案
1. 显式创建独立副本
直接在筛选后调用.copy(),生成原数据的独立副本,后续修改完全不会影响原DataFrame,也不会触发警告:
import pandas as pd data = {'City': ['New York', 'London', 'Tokyo', 'Paris'], 'Temperature': [25, 15, 28, 22]} df = pd.DataFrame(data) # 筛选后显式创建副本 cold_cities = df[df['Temperature'] < 20].copy() # 安全修改副本 cold_cities['City'] = 'Cold ' + cold_cities['City'] print(cold_cities)
2. 直接在原DataFrame上修改(若需更新原数据)
如果你的目标是修改原DataFrame中的对应行,用.loc直接定位到目标行和列操作,避免中间切片的歧义:
import pandas as pd data = {'City': ['New York', 'London', 'Tokyo', 'Paris'], 'Temperature': [25, 15, 28, 22]} df = pd.DataFrame(data) # 直接用.loc定位修改原数据 mask = df['Temperature'] < 20 df.loc[mask, 'City'] = 'Cold ' + df.loc[mask, 'City'] # 查看修改后的原DataFrame print(df)
额外提示
- 不要依赖
_is_view属性排查问题(虽然可以用cold_cities._is_view查看是否是视图),因为这是Pandas内部属性,可能随版本变化。 - 优先用上述两种方案,从根源避免视图/副本的混淆问题。
内容的提问来源于stack exchange,提问作者Bruno Paes




