Pandas:使用groupby的expanding_apply
我想要计算每个ID的最大值的扩展平均值:
import pandas as pd
import numpy as np
np.random.seed(seed=10)
df = pd.DataFrame ({'ID' : ['foo', 'bar'] * 10,
'ORDER' : np.arange(20),
'VAL' : np.random.randn(20)})
df = df.sort(columns=['ID','ORDER'])
我试过使用expanding_apply这个函数:
pd.expanding_apply(df['VAL'],lambda x : np.mean(((np.sort(np.array(x)))[-3:])))
这个函数可以用,但它是针对我所有的ID的,而我需要的是每个ID单独计算,所以我尝试用groupby来实现,但没有成功……
我尝试过:
df['AVG_MAX3']= df.groupby('ID')['VAL'].apply(pd.expanding_apply(lambda x : np.mean(((np.sort(np.array(x)))[-3:]))))
我的扩展平均值需要对每个ID从0重新开始计算
我该怎么做呢?有什么建议吗?
期望的输出结果:
ID ORDER VAL exp_mean
bar 1 0.715278974 0.715278974
bar 3 -0.00838385 0.353447562
bar 5 -0.720085561 -0.004396812
bar 7 0.108548526 0.27181455
bar 9 -0.174600211 0.27181455
bar 11 1.203037374 0.675621625
bar 13 1.028274078 0.982196809
bar 15 0.445137613 0.982196809
bar 17 0.135136878 0.982196809
bar 19 -1.079804886 0.982196809
foo 0 1.331586504 1.331586504
foo 2 -1.545400292 -0.106906894
foo 4 0.621335974 0.135840729
foo 6 0.265511586 0.739478021
foo 8 0.004291431 0.739478021
foo 10 0.43302619 0.795316223
foo 12 -0.965065671 0.795316223
foo 14 0.22863013 0.795316223
foo 16 -1.136602212 0.795316223
foo 18 1.484537002 1.145819827
1 个回答
1
你快到了,但在使用 pd.expanding_apply
这个函数时,你在进行分组操作时缺少了第一个参数。我把你计算扩展均值的部分放到了一个单独的函数里,这样会更清楚一些。
In [158]: def expanding_max_mean(x, size=3):
...: return np.mean(np.sort(np.array(x))[-size:])
In [158]: df['exp_mean'] = df.groupby('ID')['VAL'].apply(lambda x: pd.expanding_apply(x, expanding_max_mean))
In [159]: df
Out[159]:
ID ORDER VAL exp_mean
1 bar 1 0.715279 0.715279
3 bar 3 -0.008384 0.353448
5 bar 5 -0.720086 -0.004397
7 bar 7 0.108549 0.271815
9 bar 9 -0.174600 0.271815
11 bar 11 1.203037 0.675622
13 bar 13 1.028274 0.982197
15 bar 15 0.445138 0.982197
17 bar 17 0.135137 0.982197
19 bar 19 -1.079805 0.982197
0 foo 0 1.331587 1.331587
2 foo 2 -1.545400 -0.106907
4 foo 4 0.621336 0.135841
6 foo 6 0.265512 0.739478
8 foo 8 0.004291 0.739478
10 foo 10 0.433026 0.795316
12 foo 12 -0.965066 0.795316
14 foo 14 0.228630 0.795316
16 foo 16 -1.136602 0.795316
18 foo 18 1.484537 1.145820