You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

过滤更新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

火山引擎 最新活动