熊猫:用groupby扩展_apply

时间:2014-06-17 15:22:23

标签: python pandas

我正试图获得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

1 个答案:

答案 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