Groupby 为所有组提供相同的聚合值

Groupby giving same aggregate value for all groups

提问人:mockash 提问时间:11/16/2023 更新时间:11/16/2023 访问量:56

问:

我正在尝试获取每个组的平均值,并尝试将它们分配给另一个数据帧中的新列,但第一组的平均值正在所有组中填充。

下面是我的数据帧df1

level    value
CF        5
CF        4
CF        6
EL        2
EL        3
EL        1
EF        4
EF        3
EF        6

我正在获取每个组的平均值并将其保存到另一个数据帧中的新列中。df2

df2['value'] = df1.groupby(['level'])['value'].transform('mean')

但这给了我下面的结果

level    value
CF        5.0
EL        5.0
EF        5.0

实际上应该是

level    value
CF        5.0
EL        2.0
EF        4.333333

如果我不将值保存到新列,我会得到预期的结果。我不确定这是否是将组值分配给新列的正确方法。

Python pandas group-by

评论

0赞 mozway 11/16/2023
除非您提供,否则我们无法回答。请提供您的问题的输出和编辑,以便重现df2df1.to_dict('tight')df2.to_dict('tight')

答:

1赞 Suraj Shourie 11/16/2023 #1

我想你的意思是这样做:

df1.groupby(['level'])['value'].mean()

输出:

level
CF    5.000000
EF    4.333333
EL    2.000000
Name: value, dtype: float64

原始语句将不起作用,因为它会为原始数据框的每一行返回一个转换后的值。查看不赋值的独立输出:

print(df1.groupby(['level'])['value'].transform('mean'))

输出:

0    5.000000
1    5.000000
2    5.000000
3    2.000000
4    2.000000
5    2.000000
6    4.333333
7    4.333333
8    4.333333
Name: value, dtype: float64

因此,您得到 3 行相同的值 5,因为这是分配给df2['value']

根据评论编辑:

根据 df2 是什么,您可能需要合并数据帧,而不是分配列。例如:

# example df2
df2 = df1.groupby('level')['value'].sum()
df2 = df2.to_frame()

# merge with mean
df2.merge(df1.groupby('level')['value'].mean().rename('value2'), left_index=True, right_index=True)

输出:

      value    value2
level                 
CF        15  5.000000
EF        13  4.333333
EL         6  2.000000

评论

1赞 mockash 11/16/2023
谢谢你的回答。 会给我预期的结果,但在将其分配给新列时,我在所有组中都得到了 NaN。这就是我使用 .df1.groupby(['level'])['value'].mean()df2['value']=df1.groupby(['level'])['value'].mean()transform
0赞 Suraj Shourie 11/16/2023
你的是什么?你是如何定义它的df2
1赞 mockash 11/16/2023
df2是另一个数据帧,其中我拥有所有组,几乎没有其他计算列。
1赞 Suraj Shourie 11/16/2023
也将其添加到问题中。因为使用 transform 分配它将根据您的期望给出不同的结果df2.to_dict()
0赞 Suraj Shourie 11/16/2023
@mockash 因为根据它的定义方式,您可能需要使用合并运算而不是赋值
2赞 mozway 11/16/2023 #2

不应使用 groupby.transform,当您想要分配给同一 DataFrame 时,这非常有用。

在这里你需要映射

df2['value'] = df2['level'].map(df1.groupby(['level'])['value'].mean())

评论

0赞 Robert Robison 11/16/2023
应该是df2['value'] = df2['level'].map(df1.groupby(['level'])['value'].mean())
0赞 mozway 11/16/2023
@RobertRobison当然是的。由于缺乏可重复的输入;),我没有检查