我有以下列(在更广泛的数据帧中(:
>>> 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
最好是使用 strftime
:
d['date'] = d['date'].dt.strftime('%B %Y, Week %W')
print (d)
date
0 April 2017, Week 14
1 April 2017, Week 14
2 March 2017, Week 13
3 April 2017, Week 14
我发现了代码中的问题:
我的数据帧 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,您的回复实际上是正确的答案(我最初很难得到(。