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

Pandas添加新列触发SettingWithCopyWarning的原因及处理疑问

Pandas SettingWithCopyWarning 警告解析与处理

警告含义

这个警告的核心是:你正在尝试修改一个DataFrame切片的副本,但Pandas无法确定这个切片是原DataFrame的视图(和原数据共享内存)还是独立副本,因此提醒你可能出现意外的数据修改问题。

触发原因

你的代码里,df = temp_df[~temp_df[columns[0]].isna()] 这一行是对temp_df做布尔索引筛选,Pandas执行这类切片操作时,返回的结果可能是原DataFrame的视图,也可能是副本。当你后续执行df['period'] = folder[0]给df新增列时,Pandas无法确认你是想修改原temp_df还是只修改这个切片,所以抛出警告。

是否需要关注?

警告本身不会让代码崩溃,但存在潜在风险:如果df是temp_df的视图,修改df会意外改动temp_df的数据;如果是副本,就没问题。但因为Pandas的切片规则(取决于数据结构和操作)不确定,最好处理掉这个警告,避免后续出现难以排查的bug。

解决方法

有两种简单的处理方式:

1. 显式创建副本

在切片后调用.copy(),明确生成独立的DataFrame副本,后续修改就不会关联原数据:

for file in csv_files:
    temp_df = pd.read_csv(file, header=topline, skip_blank_lines=True, usecols=columns)
    # 显式生成副本
    df = temp_df[~temp_df[columns[0]].isna()].copy()
    df['period'] = folder[0]
    list_df.append(df)

2. 使用.loc明确操作

通过.loc指定行和列的索引,让Pandas明确知道你要操作的是目标数据:

for file in csv_files:
    temp_df = pd.read_csv(file, header=topline, skip_blank_lines=True, usecols=columns)
    # 用.loc筛选行并保留所有列,再创建副本
    df = temp_df.loc[~temp_df[columns[0]].isna(), :].copy()
    df['period'] = folder[0]
    list_df.append(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:42:57