基于groupby平均值的Pandas新列

yshpjwxd  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(215)

我有一个数据框

>>> df = pd.DataFrame({'a':[1,1,1,2,2,2],
...                    'b':[10,20,20,10,20,20],
...                    'result':[100,200,300,400,500,600]})
... 
>>> df
   a   b  result
0  1  10     100
1  1  20     200
2  1  20     300
3  2  10     400
4  2  20     500
5  2  20     600

并希望创建一个新列,该列是'a'和'b'的相应值的平均结果。我可以使用groupby获得这些值:

>>> df.groupby(['a','b'])['result'].mean()
a  b 
1  10    100
   20    250
2  10    400
   20    550
Name: result, dtype: int64

但是不知道如何将其转换为原始DataFrame中的新列。最终结果应该如下所示,

>>> df
   a   b  result  avg_result
0  1  10     100         100
1  1  20     200         250
2  1  20     300         250
3  2  10     400         400
4  2  20     500         550
5  2  20     600         550

我可以通过循环'a'和'b'的组合来实现,但对于较大的数据集来说,这会变得非常缓慢和笨拙。可能有一种更简单和更快的方法。

xiozqbni

xiozqbni1#

您需要transform

df['avg_result'] = df.groupby(['a', 'b'])['result'].transform('mean')

这将为您生成groupby值的正确索引列:

a   b  result  avg_result
0  1  10     100         100
1  1  20     200         250
2  1  20     300         250
3  2  10     400         400
4  2  20     500         550
5  2  20     600         550
3ks5zfa0

3ks5zfa02#

由于前面的答案(https://stackoverflow.com/a/33445035/6504287)是基于panda的,我添加了基于pyspark的解决方案,如下所示:因此,最好使用Window函数,如以下代码片段示例所示:

windowSpecAgg  = Window.partitionBy('a', 'b')
    ext_data_df.withColumn('avg_result', avg('result').over(windowSpecAgg)).show()

以上代码是针对前面提供的解决方案(https://stackoverflow.com/a/33445035/6504287)中的示例。

相关问题