Pandas DataFrame подсчитывает элементы для каждой категории

#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, затем вам просто нужно посчитать марку со значениями и годом, это больше похоже на сводный подсчет, только ваши столбцы имеют два уровня