#pandas #dataframe #pivot-table
#pandas #Фрейм данных #сводная таблица
Вопрос:
Рассмотрим следующий фрейм данных Pandas, который показывает количество проданных автомобилей разных марок и годов выпуска:
df = pd.DataFrame({'Y17': [ 1, 2, 1, 1, 0, 0, 1, 2, 2, 0],
'Y18': [ 0, 0, 1, 1, 1, 0, 0, 0, 0, 1],
'Make': ['Ford', 'Jeep', 'BMW', 'BMW', 'Mazda', 'Jeep', 'Chevy', 'BMW', 'Mazda','Ford']})
Make Y17 Y18
Ford 1 0
Jeep 2 0
BMW 1 1
BMW 1 1
Mazda 0 1
Jeep 0 0
Chevy 1 0
BMW 2 0
Mazda 2 0
Ford 0 1
Каждая строка относится к продажам определенного магазина (не записывается).
Я хотел бы повернуть этот фрейм данных, чтобы получить количество записей таким образом, чтобы индекс был «make», а столбец — это комбинация «year» и «number of sales (многоуровневые столбцы в порядке). Результат должен быть примерно таким:
Y17 Y18
0 1 2 0 1 2
Make
BMW 0 2 1 1 2 0
Chevy 0 1 0 1 0 0
Ford 1 1 0 1 1 0
Jeep 1 0 1 2 0 0
Mazda 1 0 1 1 1 0
Комментарии:
1. Код для воспроизведения и ввод отличаются?
2. Упс, исправлено. Извините!
3.
df.melt(['Make', 'Count']).pivot_table(index='Make', columns=['variable', 'Count'], values='value', fill_value=0)
Работает ли для вас?4. Что такое
Count
?5. Извините, забыл добавить это. «Количество» создается как
df['Count'] = df.groupby('Make').cumcount()
Ответ №1:
melt
затем crosstab
s=df.melt('Make')
pd.crosstab(s.Make,[s.variable,s.value]).stack().fillna(0).unstack()
variable Y17 Y18
value 0 1 2 0 1 2
Make
BMW 0 2 1 1.0 2.0 0.0
Chevy 0 1 0 1.0 0.0 0.0
Ford 1 1 0 1.0 1.0 0.0
Jeep 1 0 1 2.0 0.0 0.0
Mazda 1 0 1 1.0 1.0 0.0
Комментарии:
1. Отлично, можете ли вы объяснить шаги, чтобы я узнал, как это делается в следующий раз?
2. @Ali сначала расплавьте ваш df, затем вам просто нужно посчитать марку со значениями и годом, это больше похоже на сводный подсчет, только ваши столбцы имеют два уровня