【问题标题】:Why do I get a SettingWithCopyWarning a value is trying to be set on a copy of a slice? [duplicate]为什么我得到一个 SettingWithCopyWarning 一个值正试图在一个切片的副本上设置? [复制]
【发布时间】:2019-04-29 00:36:35
【问题描述】:

运行以下代码时:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3],"B": [2,4,8]})
df2 = df[df["A"] < 3]
df2["C"] = 100

我收到以下警告:

SettingWithCopyWarning:一个值 正在尝试在 DataFrame 中的切片副本上设置。尝试使用 .loc[row_indexer,col_indexer] = value 参见 文档: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

但这正是我想要的行为(真正的桌子很大,我不想复制它),为什么我会收到警告?为什么会有风险?

df

   A  B
0  1  2
1  2  4
2  3  8

df2

   A  B    C
0  1  2  100
1  2  4  100

【问题讨论】:

  • 因为df2df 切片的副本。试试:df2 = df[df["A"] &lt; 3].copy()
  • 它是一个非常大的DataFrame,我不想对其进行处理,为什么使用视图有风险?
  • 您只是在复制切片,但如果您不想复制,请使用loc

标签: pandas


【解决方案1】:

为什么会这样?

因为df2df 切片的副本。

为什么会有风险?

这条消息告诉您df2df 是不同的东西。之所以引入这是因为它们并不总是很明显。

从文档中获取示例代码:

def do_something(df):
   foo = df[['bar', 'baz']]  # Is foo a view? A copy? Nobody knows!
   # ... many lines here ...
   foo['quux'] = value       # We don't know whether this will modify df or not!
   return foo

我该如何解决?

通过显式复制切片:

df2 = df[df['A'] < 3].copy()
df2['C'] = 100

或使用loc:

df.loc[df['A'] < 3, 'C'] = 100

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 2016-08-24
    • 2020-05-23
    • 2018-09-18
    • 2018-06-18
    • 2016-02-17
    • 2021-10-13
    相关资源
    最近更新 更多