pandas settingwithcopywarning on groupby

4

虽然我通常能理解这些警告,而且许多帖子都涉及到这个问题,但我不明白为什么只有在我到达groupby行(最后一行)时才会收到警告:

grouped = data.groupby(['group'])

for name, group in grouped:
    data2=group.loc[data['B-values'] > 0]
    data2["unique_A-values"]=data2.groupby(["A-values"])["A-values"].transform('count')

编辑:

以下是我的数据框(data):

group    A-values    B-values
human    1           -1
human    1            5
human    1            4
human    3            4
human    2           10
bird     7            8
....

对于B值大于0的情况(data2=group.loc[data['B-values'] > 0]):

人类有两个A值等于1,一个等于3,一个等于2(data2["unique_A-values"]=data2.groupby(["A-values"])["A-values"].transform('count')

2个回答

4
你会收到这个错误,是因为你获取了groupby的引用并尝试在其上添加一列,因此它只是在警告你,如果你的意图是更新原始df,则可能起作用或者不起作用。
如果你只是修改本地副本,则使用copy()进行复制,这样就更明确了,警告也将消失:
for name, group in grouped:
    data2=group.loc[data['B-values'] > 0].copy() # <- add .copy() here
    data2["unique_A-values"]=data2.groupby(["A-values"])["A-values"].transform('count')

1

请注意,pandas分组用户指南中指出:

应将分组块视为不可变的,对分组块的更改可能会产生意想不到的结果。

for name, group in grouped:
    # making a reference to the group chunk
    data2 = group.loc[data['B-values'] > 0]
    # trying to make a change to that group chunk reference
    data2["unique_A-values"] = data2.groupby(["A-values"])["A-values"].transform('count')

话虽如此,看起来你只是想计算数据框中的值,因此最好使用value_counts()

>>> data[data['B-values']>0].groupby('group')['A-values'].value_counts()
group  A-values
bird   7           1
human  1           2
       2           1
       3           1
Name: A-values, dtype: int64

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