使用 loc 时的 Pandas SettingWithCopyWarning [重复]

Posted

技术标签:

【中文标题】使用 loc 时的 Pandas SettingWithCopyWarning [重复]【英文标题】:Pandas SettingWithCopyWarning When Using loc [duplicate] 【发布时间】:2014-10-18 20:06:10 【问题描述】:

对使用 .loc 进行索引/切片的分配有一般性问题。

假设如下DataFrame,df:

df:    
    A   B   C
0   a   b   
1   a   b   
2   b   a   
3   c   c   
4   c   a   

要重现的代码:

df = pd.DataFrame('A':list('aabcc'), 'B':list('bbaca'), 'C':5*[None])

我使用以下方法创建 df1:

df1=df.loc[df.A=='c']

df1:
    A   B   C
3   c   c   
4   c   a   

然后我根据 B 中的值给 C 赋值:

df1.loc[df1.B=='a','C']='d'

作业有效,但我收到 SettingWithCopy 警告。我做错了什么还是这是预期的功能?我认为使用 .loc 可以避免链式分配。有什么我想念的吗?我正在使用熊猫 14.1

【问题讨论】:

我不是 100% 确定这是否是一个错误,但运行您的代码我看到 df1 已修改但 df 不是您想要的。您已将 df1 分配为对您的 df 的一部分的引用,但现在执行 loc 分配仅修改了 df1,这对我来说闻起来像一个错误,但我不能 100% 确定这是否有意或无意 在这种情况下,我打算只修改 df1,只是好奇为什么我在这样做时会收到 SettingWithCopy 警告,但我认为您实际上已经回答了。在上面,df1 是对 df 切片的引用。如果我使用 df1=pandas.DataFrame(df.loc[df.A=='c']) 创建 df1,那么警告就会消失。 这里的重点是您正在修改实际上是另一个框架的一部分的框架。您通常需要复制以避免此警告,因为您有时可以对副本进行操作。 您可以在代码中更加明确,并使用df1=df.loc[df.A=='c'].copy() 这将明确您的意图,而不是发出警告。 【参考方案1】:

@EdChum 在 cmets 中对 OP 的回答已经解决了这个问题。 即替换

df1=df.loc[df.A=='c']

df1=df.loc[df.A=='c'].copy()

这将明确你的意图,而不是发出警告

【讨论】:

以上是关于使用 loc 时的 Pandas SettingWithCopyWarning [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用loc时的pandas警告

Pandas,用于布尔索引的 loc 与非 loc

在 Pandas 中使用 .loc 和 MultiIndex

Pandas 错误:“DataFrame”对象没有属性“loc”

Pandas 错误:“DataFrame”对象没有属性“loc”

Python pandas.DataFrame.loc函数方法的使用