Pandas使用loc时出现SettingWithCopyWarning警告

17

关于使用.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会避免链式赋值。我有什么遗漏吗?我正在使用Pandas 14.1


1
我不确定这是否是一个错误,但运行您的代码后,我发现df1被修改了,但df没有被修改,这不是您想要的结果。您已经将df1分配为对df的切片的引用,但现在执行loc分配只修改了df1,这让我感觉像是一个错误,但我不能确定这是否是有意为之。 - EdChum
1
在这种情况下,我的意图仅是修改 df1,只是好奇为什么这样做时会收到 SettingWithCopy 警告,但我认为您实际上已经回答了。在上述代码中,df1 是对 df 切片的引用。如果我使用 df1=pandas.DataFrame(df.loc[df.A=='c']) 创建 df1,则警告将消失。 - MattB
3
这里的重点是,您正在修改一个实际上是另一个框架片段的框架。通常需要复制才能避免此警告,因为有时您可以对复制品进行操作。 - Jeff
8
与其只是参考,你可以在代码中更加详细明确,使用 df1=df.loc[df.A=='c'].copy() 这样做会清楚地表达你的意图,并且不会引发警告。 - EdChum
1个回答

11

@EdChum在评论中的回答解决了问题。即将

替换为
df1=df.loc[df.A=='c']

需要翻译的内容为:

with

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

这将清楚地表明你的意图,而不会引起警告


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接