VS Code Notebook拆分单元格触发pandas SetWithCopyWarning咨询
相关解答
大量在VS Code Notebook、Jupyter环境下做pandas开发的用户都遇到过完全相同的现象,这既不是VS Code也不是pandas的bug,本质是对pandas的告警机制、Notebook单元格运行逻辑存在认知疏漏。
触发逻辑说明
SetWithCopyWarning本身是pandas做的启发式风险提示,不是确定性的代码错误,它不会100%稳定触发,是否告警完全依赖运行时pandas对操作对象的内存引用判断:如果判定你当前修改的对象是另一个DataFrame的切片视图,就会抛出告警,提醒你这个修改可能不会同步到原数据,产生预期外的结果。
- 所有代码放在同一个单元格运行时,pandas在单次执行流里可以明确追踪到
df = df.loc[df['column'] == 'value']是将过滤后的结果重新绑定到df变量上,后续新增列的操作直接作用在当前绑定的DataFrame上,不会判定为链式赋值风险,因此不触发告警。 - 代码拆分到不同单元格逐次运行时,VS Code Notebook的IPython内核为了支持变量面板预览、数据状态追踪等功能,会在每个单元格执行结束后额外持有所有变量的引用缓存,这会干扰pandas的引用判定:过滤后的
df会被识别为和最初读入的原始DataFrame存在内存关联,后续新增列的操作就会被判定为「在切片视图上做修改」的风险场景,进而抛出告警。
稳定规避方案
不要依赖运行时的启发式检测碰运气,只要在做切片过滤操作时显式声明生成独立拷贝,不管怎么拆分单元格执行,都不会触发这类告警:
df = pd.read_csv('my-data.csv') # 过滤后显式调用copy(),切断和原始数据的引用关联,明确生成独立的新DataFrame df = df.loc[df['column'] == 'value'].copy() df['newColumn'] = df['oldColumn'].str.contains('regex-omitted')
内容的提问来源于stack exchange,提问作者Alabaster
相关产品推荐
相关产品推荐

