给出一个看起来像这样的数据框:
date,score
2019-10-01,5
2019-10-02,4
2019-10-03,3
2019-10-04,6
如何使用后续/后续行来计算score
的平均值,以使其看起来/行为如下:
date,score
2019-10-01,5,(5+4+3+6)/4
2019-10-02,4,(4+3+6)/3
2019-10-03,3,(3+6)/2
2019-10-04,6,6
在SQL中,这是我尝试翻译的地方,在SQL中我可以编写:
select avg(score) over(order by date) ...
但是我很难在大熊猫中弄清楚这一点。
任何指导将不胜感激。
谢谢!
答案 0 :(得分:1)
在相反的系列上尝试expanding
df['calc_mean'] = df.score[::-1].expanding(1).mean()
Out[228]:
date score calc_mean
0 2019-10-01 5 4.500000
1 2019-10-02 4 4.333333
2 2019-10-03 3 4.500000
3 2019-10-04 6 6.000000
答案 1 :(得分:1)
自下而上使用cumsum
除以arange
df['cummean'] = df.score[::-1].cumsum()[::-1] / np.arange(len(df), 0, -1)
date score cummean
0 2019-10-01 5 4.500000
1 2019-10-02 4 4.333333
2 2019-10-03 3 4.500000
3 2019-10-04 6 6.000000
答案 2 :(得分:0)
cumsum
(反向系列):
df['cum_mean'] = (df[::-1].assign(c=1)
.agg({'score':'cumsum', 'c':'cumsum'})
.assign(cum_mean = lambda x: x['score']/x['c'])
['cum_mean']
)
输出:
date score cum_mean
0 2019-10-01 5 4.500000
1 2019-10-02 4 4.333333
2 2019-10-03 3 4.500000
3 2019-10-04 6 6.000000