首页 > 解决方案 > 当我们在熊猫中“分组”时进行多次计算

问题描述

正如我目前所了解到的,每次我们groupby在 pandas 中的数据帧上执行一次计算时,我们只能进行一次计算,例如列的平均值。

我们如何groupby在 pandas 中只用一个来进行多次计算(就像我们在 SQL 中所做的那样)。

例如对于数据框:

import pandas as pd
times = [21 , 34, 37, 40, 55, 65, 67, 84, 88, 90 , 91, 97, 104,105, 108]
names = ['bob', 'alice', 'bob', 'bob' , 'ali', 'alice', 'alice' , 'ali', 'moji', 'ali', 'moji', 'alice' , 'bob', 'bob', 'bob']
user_answer = [2 , 2 , 1 , 3 , 1 , 4 , 4 , 4 , 1 , 1 , 2 , 3 , 3 ,1 , 4]
correct_answer = [2 , 3 , 2 , 3 , 1 , 1 , 4 , 4 , 4 , 1 , 2 , 1 , 3 ,1 , 4]
df = pd.DataFrame({'name' : names , 'time' : times , 'user_answer'  : user_answer ,  'correct_answer'  : correct_answer})

我怎么能得到一个三列的数据框:

name:每个名字只重复一次(通过做groupby名字)

mean_time:mean该名称旁边的时间

score:该用户user_answer等于多少时间correct_answer

只有一个groupby代码?

标签: pythonpandasdataframe

解决方案


使用命名聚合创建具有比较值Series.eq和聚合的辅助列:GroupBy.agg

df1 = (df.assign(new = df.user_answer.eq(df.correct_answer))
         .groupby('name').agg(mean_time = ('time','mean'),
                             score=('new','sum'))
         .reset_index())
print (df1)
    name  mean_time  score
0    ali  76.333333      3
1  alice  65.750000      1
2    bob  69.166667      5
3   moji  89.500000      1

推荐阅读