我正试图获得3个最大值的扩展平均值:
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:])))
它有效,但我的身份证明。我需要每个我的身份证,所以我尝试使用groupby,但没有成功......
我试过了:
df['AVG_MAX3']= df.groupby('ID')['VAL'].apply(pd.expanding_apply(lambda x : np.mean(((np.sort(np.array(x)))[-3:]))))
我的expanding_mean必须从每个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
答案 0 :(得分:0)
您已关闭,但当您在groupby操作中调用它时,您在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