使用正则表达式过滤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
相关产品推荐
相关产品推荐

