【问题标题】:Python Pandas adding two dataframes SettingWithCopyWarningPython Pandas 添加两个数据框 SettingWithCopyWarning
【发布时间】:2020-05-20 13:55:44
【问题描述】:

当我完全按照官方文档的指示进行操作时,我不明白为什么会收到可怕的警告。

我们有一个名为adataframe

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


【解决方案1】:

在注意到一个不同的问题后,我找到了解决方案。

只要你说

dataframe_A = dataframe_B

您需要谨慎行事,因为 Python 似乎是通过臀部连接这两个数据帧,可以这么说。如果您对dataframe_B 进行更改,您的dataframe_A 也会随之更改!

我理解使用.copy(deep=True) 来解决这个问题,python 将创建一个完整且独立的副本,以便您可以在不影响另一个的情况下对其中一个进行更改。

在进一步调查中,对于那些感兴趣的人,它显然与“指针”有关,这是一个稍微复杂的编码概念,其范围超出了这个特定问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多