Pandas:设置与复制警告更改列的值和类型



我有以下列(在更广泛的数据帧中(:

>>> d['date']
date 
2017-04-06
2017-04-05
2017-03-28
2017-04-06

我想将这些日期转换为字符串,例如:2016 年 3 月,第 12 周。我正在执行以下操作(工作正常(:

d['date'] = d['date'].apply(lambda x: x.strftime('%B %Y, Week %W'))

有我想要的结果,但不幸的是,我收到以下警告:

file.py:53: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我试图检查SO中的其他问题并阅读pandas文档,但我不太确定如何处理它,因为我的各种尝试都失败了(例如使用.loc()(。做我想做的事情的正确方法是什么?

谢谢!

我之前有过类似的警告,并尝试复制数据框,除了尝试使用 .loc[row_indexer, column_indexer] = 值之外,还修复了它。

试试这个:

new_d = d.copy()

"在 Pandas 中,索引数据帧会返回对初始数据帧的引用。因此,更改子集将更改初始数据帧。因此,如果要确保初始数据帧不应更改,则需要使用副本。引用来自cgold的答案为什么要在 pandas

我发现了代码中的问题:

我的数据帧 d 派生自另一个称为数据的数据帧,使用:

d = data[((data['date'].dt.week == current_date.week)

在操作d之前,我正在操作另一个DataFrame,月份,也以类似的方式从数据派生,并设置了几个月的索引:

months = months.set_index('date').resample('M').sum()

因为这些是对数据的引用,而不是硬拷贝,所以 d 的索引也已经到位,这导致了警告,因为我正在以狡猾的方式操作索引。制作数据的硬拷贝解决了我的问题:

months = data.copy()
d = data.copy()

感谢您的帮助 jezrael,您的教程导致了该解决方案。谢谢nrmb,您的回复实际上是正确的答案(我最初很难得到(。

最新更新