【问题标题】:pandas dataframe copy of slice warning切片警告的熊猫数据框副本
【发布时间】:2019-04-17 00:24:06
【问题描述】:

我对 pandas 还很陌生,并且在一大段代码中遇到了臭名昭著的 SettingWithCopyWarning。我把它归结为以下几点:

import pandas as pd
df = pd.DataFrame([[0,3],[3,3],[3,1],[1,1]], columns=list('AB'))
df
df = df.loc[(df.A>1) & (df.B>1)]
df['B'] = 10

当我运行它时,我收到警告:

主要:1:SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value

奇怪的是,如果我离开“df”行,它会在没有警告的情况下运行。这是预期的行为吗?

一般来说,如果我想通过跨列的值过滤 DataFrame,是否需要执行 copy() 以避免出现 SettingWithCopyWarning?

非常感谢

【问题讨论】:

  • 我的问题是为什么我会收到警告。除非您在获取 DataFrame 的子集时总是必须使用 .copy()
  • @errg 看到我的答案和我提到的页面,这将有助于我相信。
  • 另一个 link on this 详细介绍...
  • 这两个链式操作一个接一个地独立执行。第一个是访问方法(get 操作),它将返回一个 DataFrame,其中包含 A & B atr >1 列的所有行。第二个是赋值操作(设置操作),在这个新的 DataFrame 上调用更改的数据。我们根本没有在原始 DataFrame 上进行操作,而是在更改数据集
  • 感谢您的帮助。我想重点是当我完成了:df = df.loc[(df.A>1) & (df.B>1)],即使我已经扔掉了原来的 DataFrame,df 仍然被考虑成为其中的一部分,如果我想修改它,我需要明确地复制它。

标签: python pandas


【解决方案1】:

从您的问题中假设您的 DataFrame 如下所示,这将避免 SettingWithCopyWarning

github Discussion 和其中一位 Pandas 开发人员 Jeff 提出的解决方案 :)

df
   A  B
1  3  3

最好用这种方式。

df['B'] = df['B'].replace(3, 10)
df
   A   B
1  3  10

【讨论】:

  • 但这有点疯狂——你必须知道之前的值是什么 (3) 才能用 10 替换它。
  • @KenWilliams,确实如此。
猜你喜欢
  • 2016-12-14
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2021-12-30
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多