Pandas:SettingWithCopyWarning更改值和列类型

时间:2017-04-06 05:10:26

标签: python pandas dataframe

我有以下专栏(在更广泛的数据框中):

>>> 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())。做我想做的事的正确方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:3)

更好的是使用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

答案 1 :(得分:1)

我之前有类似的警告,并尝试复制数据框,修复它与尝试使用.loc [row_indexer,column_indexer] =值的区别。

试试这个:

new_d = d.copy()

“在Pandas中,索引DataFrame会返回对初始DataFrame的引用。因此,更改子集会更改初始DataFrame。因此,如果要确保初始DataFrame不应该',则需要使用该副本'改变。“ 来自cgold 的引用答案 why should I make a copy of a data frame in pandas

答案 2 :(得分:0)

我发现我的代码中存在什么问题:

我的DataFrame d 使用以下内容从另一个名为 data 的DataFrame派生而来:

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

在操作 d 之前,我正在以类似的方式操纵另一个DataFrame, months ,也来自 data 并为<设置< EM>个月:

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

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

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

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