Объедините кучу разных данных в одну группу с несколькими столбцами

1

У меня есть большой dataframe данных в 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      #           #           #
...

Это возможно?

Теги:
pandas
pandas-groupby
data-analysis

2 ответа

3
Лучший ответ

Здесь я добавил новую тему для Python и предоставил в качестве dict для загрузки в dataframe.

Решение представляет собой комбинацию метода agg() в группе, где агрегирования предоставляются в словаре, а затем использование настраиваемой функции агрегации для вашего требования уграда:

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

Используйте 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню