【发布时间】:2020-05-20 13:55:44
【问题描述】:
当我完全按照官方文档的指示进行操作时,我不明白为什么会收到可怕的警告。
我们有一个名为a的dataframe
a = pd.DataFrame(data = [['Tom',1],
['Tom',1],
['Dick',1],
['Dick',1],
['Harry',1],
['Harry',1]], columns = ['Col1', 'Col2'])
a
Out[377]:
Col1 Col2
0 Tom 1
1 Tom 1
2 Dick 1
3 Dick 1
4 Harry 1
5 Harry 1
首先我们创建一个“持有者”dataframe:
holder = a
然后我们创建a的子集:
c = a.loc[a['Col1'] == 'Tom',:]
c
Out[379]:
Col1 Col2
0 Tom 1
1 Tom 1
我们创建另一个子集d,它将被添加到前一个子集c(一个切片),但是一旦我们尝试将d添加到c,我们就会得到警告:
d = a.loc[a['Col1'] == 'Tom','Col2']
d
Out[389]:
0 1
1 1
c.loc[:,'Col2'] += d
C:\Users\~\anaconda3\lib\site-packages\pandas\core\indexing.py:494: 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
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
self.obj[item] = s
我想了解我做错了什么,因为我经常使用这种逻辑(来自 R,一切都不是该死的 object)
【问题讨论】:
-
您能否添加一个完整且可重现的代码示例(即运行时生成此
SettingWithCopyWarning的完全独立的代码示例)? -
您是否阅读过有关该主题的一些资源?例如:stackoverflow.com/q/20625582/11301900。顺便说一句,如果你想获得由多列组成的 DataFrame 的子集,你可以简单地使用
df[['col_1', 'col_3']]而不是使用.loc[]。 -
另外,你能分享一个minimal reproducible example吗?我无法重现该问题。
标签: python arrays pandas slice