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
相关产品推荐
相关产品推荐

