Как включить критерии сортировки в функцию сводной таблицы?

#python #pandas #pivot-table

Вопрос:

Ниже приведен мой код, в котором я использовал функцию сводной таблицы в df dataframe.

 df = pd.DataFrame({'State' : ['B','B','A','A','C', 'C'],
           'Age' : ['1 to 5', '6 to 10', '1 to 5', '6 to 10', '1 to 5', '6 to 10'],
           'Vaccinated' : [80, 20, 30, 60, 10, 15],
           'Population': [100, 100, 100, 100, 100, 100],
           'Percentage' : [0.80, 0.20, 0.30, 0.60, 0.10,0.15]})

df1 = pd.pivot_table(df,values=["Vaccinated", "Population","Percentage"],index=["State", "Age"], aggfunc=np.sum)
 

Результаты из предыдущего кода:

                    Percentage  Population  Vaccinated
State Age                                        
A     1 to 5         0.30         100          30
      6 to 10        0.60         100          60
B     1 to 5         0.80         100          80
      6 to 10        0.20         100          20
C     1 to 5         0.10         100          10
      6 to 10        0.15         100          15
 

Однако я хочу отсортировать свои записи так, чтобы состояние B было вверху, за которым следует A, а затем C.
Рационально, потому что состояние B имеет 100% вакцинированных (60% 40%), состояние A имеет 90% (60% 30%) amp; Состояние С имеет 25%. Попробуйте добавить сортировку несколько раз, и я столкнулся с ошибками.

Могу ли я обратиться за советом, как добавить критерии сортировки во время или после pivot_table, чтобы я мог достичь приведенных ниже результатов?

                Percentage  Population  Vaccinated
State Age                                        
B     1 to 5         0.80         100          80
      6 to 10        0.20         100          20
A     1 to 5         0.30         100          30
      6 to 10        0.60         100          60
C     1 to 5         0.10         100          10
      6 to 10        0.15         100          15
 

Ответ №1:

Мы можем использовать groupby sum для получения общего Vaccinated числа по каждому State , затем sort_values для определения порядка, в котором должны находиться состояния, затем мы можем reindex на State уровне изменить порядок на основе группового итога:

 df1 = df1.reindex(
    index=df1.groupby(level='State')['Vaccinated'].sum()
        .sort_values(ascending=False).index,
    level='State'
)
 

df :

                Percentage  Population  Vaccinated
State Age                                        
B     1 to 5         0.80         100          80
      6 to 10        0.20         100          20
A     1 to 5         0.30         100          30
      6 to 10        0.60         100          60
C     1 to 5         0.10         100          10
      6 to 10        0.15         100          15
 

Комментарии:

1. Спасибо Генри за объяснение. Подробное объяснение позволяет мне понимать и следовать коду небольшими шагами. Я заметил, что 1-й и ваш общий доступ не использует сводную таблицу для сортировки. Я предположил, что это ограничение функции сводной таблицы?

2. Сортировка в сводной таблице ограничена одним столбцом. Сводная таблица не знает итогов уровня состояния до тех пор, пока таблица уже не будет свернута, поэтому нам нужно переиндексировать сводную таблицу впоследствии.

Ответ №2:

Один из способов — создать вспомогательный столбец с суммой группы, отсортировать по нему df, а затем удалить его:

 df1 = df1.assign(Sum=df1.groupby(level=0).Vaccinated.transform('sum')).
    sort_values(by='Sum', ascending=False).drop(columns=['Sum'])
print(df1)
 

С принтами:

                Percentage  Population  Vaccinated
State Age                                        
B     1 to 5         0.80         100          80
      6 to 10        0.20         100          20
A     1 to 5         0.30         100          30
      6 to 10        0.60         100          60
C     1 to 5         0.10         100          10
      6 to 10        0.15         100          15
 

Комментарии:

1. Спасибо. Код работает отлично.