要确定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
答案 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
。