我有一个数据框
>>> 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'的组合来实现,但对于较大的数据集来说,这会变得非常缓慢和笨拙。可能有一种更简单和更快的方法。
2条答案
按热度按时间xiozqbni1#
您需要
transform
:这将为您生成groupby值的正确索引列:
3ks5zfa02#
由于前面的答案(https://stackoverflow.com/a/33445035/6504287)是基于panda的,我添加了基于pyspark的解决方案,如下所示:因此,最好使用
Window
函数,如以下代码片段示例所示:以上代码是针对前面提供的解决方案(https://stackoverflow.com/a/33445035/6504287)中的示例。