使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中使用 .loc 和 MultiIndex
Pandas 错误:“DataFrame”对象没有属性“loc”