我是 Pandas 新手,有点不知道在这里要做什么。我有一个从 csv 导入的数据框,它(大大简化)如下所示:
date = ['2013-08-10','2013-08-10','2013-08-10','2013-08-10','2013-08-10',
'2013-08-10','2013-08-10','2013-08-10','2013-08-10','2013-08-10']
event = ['213','213','213','213','214','214','214','215','215','215']
side = ['A','B','B','B','A','B','A','B','A','B',]
value = [0.193,0.193,0.092,0.027,0.027,0.058,0.027,0.079,0.193,0.159]
df = pd.DataFrame(zip(event,date,side,value),
columns=['event','date','side','value'])
event date side value
0 213 2013-08-10 A 0.193
1 213 2013-08-10 B 0.193
2 213 2013-08-10 B 0.092
3 213 2013-08-10 B 0.027
4 214 2013-08-10 A 0.027
5 214 2013-08-10 B 0.058
6 214 2013-08-10 A 0.027
7 215 2013-08-10 B 0.079
8 215 2013-08-10 A 0.193
9 215 2013-08-10 B 0.159
我想要的是对每个事件的每一侧对应的值进行求和。这是我通过 groupby 实现的:
groupby = df.groupby(['event','side']).sum()
value
event side
213 A 0.193
B 0.312
214 A 0.054
B 0.058
215 A 0.193
B 0.238
但我还想添加一个新列,其中每一侧的均值都扩展,如下所示:
value
event side roll_mean
213 A 0.193 0
B 0.312 0
214 A 0.054 0.193
B 0.058 0.312
215 A 0.193 0.124
B 0.238 0.185
请注意,每个事件都有两侧,但并不总是 A 和 B。我想要的是类似于 excel 的mean.if 函数,它计算当前侧所有值的扩展平均值,应用于所有先前的行。对此的任何帮助将不胜感激。
最佳答案
我认为您实际上正在寻找扩展平均值,而不是滚动平均值。扩展均值考虑每个先前的值。我将从您上次停下的地方开始:
In [63]: res = df.groupby(['event','side']).sum()
In [64]: res
Out[64]:
value
event side
213 A 0.193
B 0.312
214 A 0.054
B 0.058
215 A 0.193
B 0.238
现在我们要按 side
进行分组并采用扩展平均值:
In [65]: res['expanding_mean'] = res.groupby(level='side').apply(pd.expanding_mean).shift(2)
In [66]: res
Out[66]:
value expanding_mean
event side
213 A 0.193 NaN
B 0.312 NaN
214 A 0.054 0.1930
B 0.058 0.3120
215 A 0.193 0.1235
B 0.238 0.1850
您的结果需要平移
2,因为您希望平均值包含所有之前的结果,而不是当前的结果(确保这是您实际的结果)想要,这似乎有点搞笑)。您可以将 shift(2)
替换为 len(res.index.levels[1])
,以使其更加通用,以防您有超过 2 条边。
关于python - Pandas groupby - 按列值扩展平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917287/