You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas SettingWithCopyWarning警告求助:使用loc仍触发该警告

解决SettingWithCopyWarning警告的方案

问题原因

哪怕用了loc做过滤,new_df依然可能是原DataFramesearch_GDPperCapita的视图(view),而非独立的副本。当你试图给视图直接加列时,pandas没法确定你是想改原数据还是只改这个切片,所以抛出警告。

可行解决方案

方案1:显式创建过滤后的副本

在赋值时调用.copy(),让new_df成为完全独立的DataFrame,后续操作就不会触发警告:

new_df = search_GDPperCapita.loc[search_GDPperCapita['id'].str.match(pat='PCAGDP[A-Z][A-Z]A646NWDB')].copy()
# 新增country列
new_df['country'] = new_df['title'].str.extract('Gross Domestic Product Per Capita for (.+)')

方案2:用loc链式操作直接修改(不推荐,仅临时规避)

如果不想创建副本,可以直接在原DataFrame的切片上通过loc添加列,确保操作的明确性:

# 直接给原DataFrame的指定行新增country列
search_GDPperCapita.loc[search_GDPperCapita['id'].str.match(pat='PCAGDP[A-Z][A-Z]A646NWDB'), 'country'] = search_GDPperCapita['title'].str.extract('Gross Domestic Product Per Capita for (.+)')
# 再提取目标数据
new_df = search_GDPperCapita.loc[search_GDPperCapita['id'].str.match(pat='PCAGDP[A-Z][A-Z]A646NWDB')]

方案3:用assign方法创建新列

assign方法会直接返回一个新的DataFrame,天生避开视图问题:

new_df = search_GDPperCapita.loc[search_GDPperCapita['id'].str.match(pat='PCAGDP[A-Z][A-Z]A646NWDB')].assign(
    country=lambda x: x['title'].str.extract('Gross Domestic Product Per Capita for (.+)')
)

关键提醒

  • 优先选方案1,显式创建副本能让代码逻辑更清晰,避免后续不小心修改原数据的意外情况。
  • 这个警告本身不是代码错误,但忽略它可能导致后续数据修改的结果和预期不符(比如改了视图但原数据没变化,或者反过来)。

内容的提问来源于stack exchange,提问作者wjosielct

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:52:09