猿问

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

我在Pandas中拥有大型数据框(比如说一所大学的课程),如下所示:


ID          name        credits     enrolled    ugrad/grad  year        semester

1           Math        4           62          ugrad       2016        Fall

2           History     3           15          ugrad       2016        Spring

3           Adv Math    3           8           grad        2017        Fall

...

而且我想按年份和学期将其分组,然后在其上获取一堆不同的汇总数据,但如果可以的话,一次全部打包。例如,我想要一个特定学期的课程总数,仅本科课程的总数以及入学总数。我可以使用value_counts单独完成每个操作,但我希望获得如下输出:


year        semester    count       count_ugrad total_enroll

2016        Fall        #           #           #

            Spring      #           #           #

2017        Fall        #           #           #

            Spring      #           #           #

...

这可能吗?


心有法竹
浏览 173回答 2
2回答

杨__羊羊

在这里,我为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  year0   1        4        62      Math     Fall      ugrad  20161   2        3        15   History   Spring      ugrad  20162   3        3         8  Adv Math     Fall       grad  20173   4        4         8   Python   Spring       ugrad  2017print df.groupby(['year','semester']).agg({'name':['count'],'enrolled':['sum'],'ugrad/grad':my_custom_ugrad_aggregator})给出:               name                 ugrad/grad enrolled              count my_custom_ugrad_aggregator      sumyear semester                                          2016 Fall         1                          1       62     Spring       1                          1       152017 Fall         1                          0        8     Spring       1                          1        8

潇湘沐

将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 Coursesyear semester                                            2016 Fall                1              62              1     Spring              1              15              12017 Fall                0               8              1
随时随地看视频慕课网APP

相关分类

Python
我要回答