我的数据框如下:
user | profit
-------------
Anna | 1.0
Bell | 2.0
Anna | 2.0
Chad | 5.0
Bell | 4.0
Anna | 3.0
我需要在用户级别上计算每行的平均值,也就是说,每次看到同一个用户时,我都要计算出到目前为止的利润平均值。
例如,安娜的第一个利润均值为1.0,而第二个利润均值为1.5,依此类推。
所需结果如下:
user | profit | mean
--------------------
Anna | 1.0 | 1.0
Bell | 2.0 | 2.0
Anna | 2.0 | 1.5
Chad | 5.0 | 5.0
Bell | 4.0 | 3.0
Anna | 3.0 | 2.0
在Python / Pandas中有这样做的建议吗?
import pandas as pd
record = pd.DataFrame({
"user": ("Anna", "Bell", "Anna", "Chad", "Bell", "Anna"),
"profit": (1.0, 2.0, 2.0, 5.0, 4.0, 3.0)
})
谢谢!
答案 0 :(得分:2)
将GroupBy.transform
与rolling
和mean
一起使用:
df['mean'] = (df.groupby('user')['profit']
.transform(lambda x: x.rolling(len(x), min_periods=1).mean()))
print (df)
user profit mean
0 Anna 1.0 1.0
1 Bell 2.0 2.0
2 Anna 2.0 1.5
3 Chad 5.0 5.0
4 Bell 4.0 3.0
5 Anna 3.0 2.0
答案 1 :(得分:1)
我认为到目前为止,我们可以使用cumsum()除以计数。
g = df.groupby('user')['profit']
df['mean'] = g.cumsum() / (g.cumcount() + 1)
完整示例
import pandas as pd
import numpy as np
df = pd.DataFrame({
"user": ("Anna", "Bell", "Anna", "Chad", "Bell", "Anna"),
"profit": (1.0, 2.0, 2.0, 5.0, 4.0, 3.0)
})
g = df.groupby('user')['profit']
df['mean'] = g.cumsum() / (g.cumcount() + 1)
print(df)
返回:
user profit mean
0 Anna 1.0 1.0
1 Bell 2.0 2.0
2 Anna 2.0 1.5
3 Chad 5.0 5.0
4 Bell 4.0 3.0
5 Anna 3.0 2.0