为了账号安全,请及时绑定邮箱和手机立即绑定

在具有多个列的groupby中聚集一堆不同的数据

在具有多个列的groupby中聚集一堆不同的数据

心有法竹 2021-03-31 21:18:21
我在Pandas中拥有大型数据框(比如说一所大学的课程),如下所示:ID          name        credits     enrolled    ugrad/grad  year        semester1           Math        4           62          ugrad       2016        Fall2           History     3           15          ugrad       2016        Spring3           Adv Math    3           8           grad        2017        Fall...而且我想按年份和学期将其分组,然后在其上获取一堆不同的汇总数据,但如果可以的话,一次全部打包。例如,我想要一个特定学期的课程总数,仅本科课程的总数以及入学总数。我可以使用value_counts单独完成每个操作,但我希望获得如下输出:year        semester    count       count_ugrad total_enroll2016        Fall        #           #           #            Spring      #           #           #2017        Fall        #           #           #            Spring      #           #           #...这可能吗?
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

在这里,我为Python添加了一个新主题,并作为将其加载到数据帧中的指令提供。


解决方案是在groupby上使用agg()方法的组合,在字典中提供聚合,然后根据您的ugrad要求使用自定义聚合函数:


def my_custom_ugrad_aggregator(arr):

    return sum(arr == 'ugrad')


dict = {'name': {0: 'Math', 1: 'History', 2: 'Adv Math', 3: 'Python'}, 'year': {0: 2016, 1: 2016, 2: 2017, 3: 2017}, 'credits': {0: 4, 1: 3, 2: 3, 3: 4}, 'semester': {0: 'Fall', 1: 'Spring', 2: 'Fall', 3: 'Spring'}, 'ugrad/grad': {0: 'ugrad', 1: 'ugrad', 2: 'grad', 3: 'ugrad'}, 'enrolled': {0: 62, 1: 15, 2: 8, 3: 8}, 'ID': {0: 1, 1: 2, 2: 3, 3: 4}}

df  =pd.DataFrame(dict)



   ID  credits  enrolled      name semester ugrad/grad  year

0   1        4        62      Math     Fall      ugrad  2016

1   2        3        15   History   Spring      ugrad  2016

2   3        3         8  Adv Math     Fall       grad  2017

3   4        4         8   Python   Spring       ugrad  2017


print df.groupby(['year','semester']).agg({'name':['count'],'enrolled':['sum'],'ugrad/grad':my_custom_ugrad_aggregator})

给出:


               name                 ugrad/grad enrolled

              count my_custom_ugrad_aggregator      sum

year semester                                          

2016 Fall         1                          1       62

     Spring       1                          1       15

2017 Fall         1                          0        8

     Spring       1                          1        8


查看完整回答
反对 回复 2021-04-09
?
潇湘沐

TA贡献1816条经验 获得超6个赞

将agg与字典一起使用,以了解如何汇总/汇总各列:


df_out = df.groupby(['year','semester'])[['enrolled','ugrad/grad']]\

           .agg({'ugrad/grad':lambda x: (x=='ugrad').sum(),'enrolled':['sum','size']})\

           .set_axis(['Ugrad Count','Total Enrolled','Count Courses'], inplace=False, axis=1)


df_out

输出:


               Ugrad Count  Total Enrolled  Count Courses

year semester                                            

2016 Fall                1              62              1

     Spring              1              15              1

2017 Fall                0               8              1


查看完整回答
反对 回复 2021-04-09
  • 2 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号