#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. Спасибо. Код работает отлично.