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

时间:2018-06-20 18:24:57

标签: python pandas data-analysis pandas-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      #           #           #
...

这可能吗?

2 个答案:

答案 0 :(得分:3)

在这里,我为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

答案 1 :(得分:1)

在字典中使用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