按两个元素分组的数据帧统计

时间:2016-12-07 09:23:01

标签: python python-3.x pandas

要确定pandas dataframe组的统计信息,我在Chris Albon找到了一个解释,我希望将其应用于按两个元素分组的数据框(此MWE中的“a”和“b”)。

所以这是一个计算某些组统计数据的函数:

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

数据框df的定义:

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”分组的统计表:

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

但是建议的unstack()函数不会合并数据帧。我想要的是什么:

    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

2 个答案:

答案 0 :(得分:5)

您需要使用leaderbaordRef = FirebaseRefrence; public void Query(int level, DatabaseReference leaderboardRef){ GoldUserList = new List<UserDetails>(); leaderboardRef.Child ("Users").OrderByChild("LevelMax").StartAt(90).GetValueAsync ().ContinueWith (taskGold => { if (taskGold.IsFaulted) { Debug.LogError (taskGold.Exception); return; } foreach (DataSnapshot GoldUser in taskGold.Result.Children) { UserDetails ListUser = new UserDetails (GoldUser.Key); GoldUserList.Add (ListUser); print ("GoldUser" + ListUser.username); } }); } 返回Series

apply

但更好的是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 使用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

答案 1 :(得分: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

如果您希望reset_index()a作为列而不是索引,也可以链接b