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

Pandas SettingWithCopyError求助:多种赋值方式无效(版本0.25.3)

解决Pandas 0.25.3中的SettingWithCopyError问题

你的问题根源在于初始的df是原DataFrame(other_df)的视图,而非独立副本。在Pandas 0.25.3这类旧版本中,当你通过列选择(other_df[['id','date','price']])得到的DataFrame默认是原数据的视图——也就是说,它并没有在内存中创建新的数据集,只是指向原数据的一部分。这时候对df进行赋值操作,Pandas会抛出SettingWithCopyError,因为它无法确定你是想修改原数据还是仅操作当前的df。

你尝试的几种赋值方式(直接列赋值、loc赋值)之所以无效,是因为它们都没有解决“df是视图”这个核心问题,Pandas依然会认为你可能在无意中修改原数据的视图。

解决方案:明确创建副本

最直接有效的办法是在初始化df时,使用.copy()方法生成独立副本,这样后续对df的所有操作都不会关联到原other_df,也不会触发视图相关的错误。

修改后的完整代码如下:

import pandas as pd
import numpy as np

# 关键修改:添加.copy()创建独立副本
df = other_df[['id','date','price']].copy()

def date_augment(df, col):
    # 可选:这里也可以对field创建副本,进一步避免视图问题
    field = df[col].copy()
    attr = ['Year', 'Month', 'Week', 'Day', 'Dayofweek', 'Dayofyear', 
            'Is_month_end', 'Is_month_start', 'Is_quarter_end', 
            'Is_quarter_start', 'Is_year_end', 'Is_year_start']
    for n in attr:
        # 这里的赋值现在会作用于独立的df副本,不会触发错误
        df[n] = getattr(field.dt, n.lower())
    df['Elapsed'] = field.astype(np.int64) // 10 ** 9

date_augment(df, 'date')

额外说明

  • 在Pandas的新版本中,对视图的检测会更严格,但核心逻辑不变:如果你的操作可能影响原数据,就会触发警告/错误。明确使用.copy()是避免这类问题的通用方案。
  • 如果你确实需要修改原other_df的数据,那应该直接对原DataFrame操作,而不是通过视图;但从你的代码逻辑来看,你应该是想基于切片后的df做数据增强,所以创建副本是更合理的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:24:11