提问人:mockash 提问时间:11/16/2023 更新时间:11/16/2023 访问量:56
Groupby 为所有组提供相同的聚合值
Groupby giving same aggregate value for all groups
问:
我正在尝试获取每个组的平均值,并尝试将它们分配给另一个数据帧中的新列,但第一组的平均值正在所有组中填充。
下面是我的数据帧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
如果我不将值保存到新列,我会得到预期的结果。我不确定这是否是将组值分配给新列的正确方法。
答:
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当然是的。由于缺乏可重复的输入;),我没有检查
上一个:MySQL组未按预期生成
评论
df2
df1.to_dict('tight')
df2.to_dict('tight')