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

使用正则表达式过滤DataFrame后,通过loc设置新列时出现SettingWithCopyWarning的原因排查

为什么正则过滤操作会触发pandas的视图/副本警告?

嘿,这个问题其实是pandas里非常常见的「视图vs副本」陷阱,我来给你一步步拆解清楚:

1. 正则过滤那一步埋下的隐患

你执行的正则过滤代码是:

scores = scores[scores['StudentId'].apply(lambda x: (regex.search(x) != None))]

这种布尔索引赋值的操作,pandas内部无法明确判断返回的结果是原DataFrame的视图(和原数据共享内存)还是副本(独立的新数据)。这时候变量scores指向的对象,本质上是一个"不确定身份"的切片——pandas没法保证它和原数据的关联关系。

2. 为什么后续加列会触发警告?

当你接着执行:

scores.loc[:, 'Average'] = scores[['Quiz1', 'Quiz2', 'Quiz3']].mean(axis=1).round(2)

虽然你用了.loc来赋值,但此时scores本身可能是一个副本而非原数据的视图。pandas会担心:你是不是误以为自己在修改原DataFrame,但实际上只是在修改一个副本?所以抛出警告提醒你这个潜在的操作风险。

3. 怎么解决这个警告?

有两种简单的方案:

  • 方案一:用.loc完成过滤,明确操作原数据的切片
    把过滤操作改成用.loc来实现,这样pandas能明确识别你要的是原数据的可修改切片:

    scores = scores.loc[scores['StudentId'].apply(lambda x: regex.search(x) is not None), :]
    
  • 方案二:显式创建副本
    如果你确实不需要保留原数据,只想操作过滤后的新数据,可以直接用.copy()显式生成副本,告诉pandas你就是要操作这个独立的数据集:

    scores = scores[scores['StudentId'].apply(lambda x: regex.search(x) is not None)].copy()
    

两种方法都能消除警告,具体选哪种取决于你是否需要保留原DataFrame的原始数据~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:27:43