2016-12-07 41 views
2

要確定pandas dataframe組的統計數據,我找到了Chris Albon的解釋說明我想應用於由兩個元素(本MWE中的「a」和「b」)分組的數據幀。按兩個元素分組的數據幀統計

所以這裏是一個函數來計算某組統計數據:

df = pd.DataFrame({'a':['A','A','B','B','B','C'], 
        'b':['A','A','B','A','B','A'], 
        'c':[ 1, 2, 5, 5, 4, 6 ]}) 

然後創建由 「A」 和 「B」 分組的統計表格:一個數據幀df

def get_group_stats(group): 
    return {'count': group.count().add_prefix('count_'), 
      'mean': group.mean().add_prefix('mean_'), 
      'sum': group.sum().add_prefix('sum_')} 

定義:

s1 = df.groupby(['a', 'b']).apply(get_group_stats) 

但建議的unstack()函數做n合併數據幀是正確的。我不想要什麼:

a | b | count_c | mean_c | sum_c 
------------------------------------------------- 
    A | A | 2 | 1.5 | 3.0 
    B | A | 1 | 5.0 | 5.0 
    B | B | 2 | 4.5 | 9.0 
    C | B | 1 | 6.0 | 6.0 

回答

5

您需要apply返回Series

def get_group_stats(group): 
    return pd.Series({'count': group.c.count(), 
         'mean': group.c.mean(), 
         'sum': group.c.sum()}) 


s1 = df.groupby(['a', 'b']).apply(get_group_stats).add_suffix('_c') 
print (s1) 
    count_c mean_c sum_c 
a b       
A A  2.0  1.5 3.0 
B A  1.0  5.0 5.0 
    B  2.0  4.5 9.0 
C A  1.0  6.0 6.0 

但更好的是使用aggregate通過功能list

s1 = df.groupby(['a', 'b'])['c'].agg(['count','mean','sum']).add_suffix('_c').reset_index() 
print (s1) 
    a b count_c mean_c sum_c 
0 A A  2  1.5  3 
1 B A  1  5.0  5 
2 B B  2  4.5  9 
3 C A  1  6.0  6 
2

您可以使用DataFrameGroupBy.agg此:

In [1]: df.groupby(['a', 'b'])['c'].agg(['count','mean','sum']).add_suffix('_c') 

Out[1]: 
    count_c mean_c sum_c 
a b       
A A  2  1.5  3 
B A  1  5.0  5 
    B  2  4.5  9 
C A  1  6.0  6 

如果您想將ab作爲列而不是索引,則也可以鏈接reset_index()

+0

優雅的解決方案!我添加了'.reset_index()' – API

+0

@Api:@Jezrael在我發佈之後立即爲他的答案提供了這個'agg'解決方案。你應該接受他的答案,它更完整。 –