【发布时间】: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 仍然被考虑成为其中的一部分,如果我想修改它,我需要明确地复制它。