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
相关产品推荐
相关产品推荐

