python - 当我们在熊猫中“分组”时进行多次计算
问题描述
正如我目前所了解到的,每次我们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
代码?
解决方案
使用命名聚合创建具有比较值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