在Pandas中,如何在groupby.agg()方法中应用2个自定义公式?

时间:2014-10-14 03:04:01

标签: python pandas grouping dataframe

我有这个df:

 A = pd.DataFrame([['Big', -2, 4, 1, 0], ['Medium', 4, 4, -1, -1], ['Big', 3, -3, -2, -1], ['Small', 0, -1, -3, 5], ['Small', 1, 4, -2, 5]],
             columns=['A', 'B', 'C', 'D', 'E'], index=[1, 2, 3, 4, 5])

我想按A分组,并在其他列上进行计算('表示',' std'和两个自定义)。自定义函数仅计算> = 0的元素,以及< = 0的元素。这将是输出:

                                         A
                Big                   Medium                   Small
       mean   std   Up   Down    mean  std   Up   Down    mean   std   Up   Down
B      0.50  3.53    1   1         4   Nan     1     0     0.50  0.70    2     0
C      0.50  4.94    1   1         4   Nan     1     0     1.50  3.53    1     1
D     -0.50  2.12    1   1        -1   Nan     0     1    -2.50  0.70    0     2
E     -0.25  0.70    1   1        -1   Nan     0     1     5.00  0.0     2     0

注意:显示器不必处于这种形状,重要的是它包含我需要的所有信息。

到目前为止我得到了这个

f = ['mean', 'std']
A.groupby(A['A']).agg(f)

           B               C               D               E          
        mean       std  mean       std  mean       std  mean       std
A                                                                     
Big      0.5  3.535534   0.5  4.949747  -0.5  2.121320  -0.5  0.707107
Medium   4.0       NaN   4.0       NaN  -1.0       NaN  -1.0       NaN
Small    0.5  0.707107   1.5  3.535534  -2.5  0.707107   5.0  0.000000

我坚持使用其他两个功能,我尝试做自定义公式

function = ['mean', 'std', (lambda x: x >= 0).sum(), (lambda y: y < 0).sum()]

但我明白了:

AttributeError: 'function' object has no attribute 'sum'

由于

1 个答案:

答案 0 :(得分:2)

In [17]: def up(x):
    return (x>=0).sum()
   ....: 

In [18]: def down(x):
    return (x<0).sum()
   ....: 

In [19]: f = ['mean', 'std', up, down]

In [20]: A.groupby(A['A']).agg(f)
Out[20]: 
           B                         C                         D            \
        mean       std  up  down  mean       std  up  down  mean       std   
A                                                                            
Big      0.5  3.535534   1     1   0.5  4.949747   1     1  -0.5  2.121320   
Medium   4.0       NaN   1     0   4.0       NaN   1     0  -1.0       NaN   
Small    0.5  0.707107   2     0   1.5  3.535534   1     1  -2.5  0.707107   

                     E                      
        up  down  mean       std  up  down  
A                                           
Big      1     1  -0.5  0.707107   1     1  
Medium   0     1  -1.0       NaN   0     1  
Small    0     2   5.0  0.000000   2     0  

你有两个问题:

首先,您将括号放在错误的位置:(lambda x: x >= 0).sum()应为lambda x: (x >= 0).sum()

第二个是pandas试图从聚合函数的名称中找出agg()的列的名称,所以如果你试图将两个lambda函数传递给agg(),你会收到错误。将它们定义为函数解决了这个问题(正如我上面所述)。