Pandas расширенное создание столбца из другого фрейма данных - PullRequest
0 голосов
/ 01 августа 2020

У меня есть фрейм данных, как показано ниже:

df_detail = 
    car_brand   car_type
0   Toyota  Sedan
1   Toyota  Truck
2   Honda   Truck
3   Mazda   Sedan
4   Mazda   Convertible

Я хочу создать сводный фрейм данных, как показано ниже:

df_summary=
ID car_brand count_Sedan count_Truck count_Convertible
0 Toyota     1           1           0
1 Honda      0           1           0
2 Mazda      1           0           1

Есть ли способ создать столбцы count_, используя pandas? Я пробовал следующее:

import pandas as pd
d = {'car_brand':['Toyota','Toyota','Honda','Mazda','Mazda'],'car_type':['Sedan','Truck','Truck','Sedan','Convertible']}
df_detail = pd.DataFrame(data=d)
df_summary = pd.DataFrame({'car_brand':[]})
df_summary['car_brand'] = df_detail['car_brand'].unique()
df_summary['count_Sedan']=df_detail[((df_detail['car_brand']==df_summary['car_brand']) & 
                                     (df_detail['car_type']=='Sedan'))].count()

Получаю сообщение об ошибке:

ValueError: Can only compare identically-labeled Series objects

ОТВЕТ:

df_detail.set_index('car_brand')['car_type'].str.get_dummies().sum(level=0).add_prefix('count_').reset_index()

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Попробуйте это, используя .str.get_dummies:

df_detail.set_index('car_brand')['car_type'].str.get_dummies()\
         .sum(level=0).add_prefix('count_')

Вывод:

           count_Convertible  count_Sedan  count_Truck
car_brand                                             
Toyota                     0            1            1
Honda                      0            0            1
Mazda                      1            1            0

и добавьте .reset_index, чтобы получить индекс в виде целых чисел:

df_detail.set_index('car_brand')['car_type'].str.get_dummies()\
         .sum(level=0).add_prefix('count_').reset_index()

Выход:

  car_brand  count_Convertible  count_Sedan  count_Truck
0    Toyota                  0            1            1
1     Honda                  0            0            1
2     Mazda                  1            1            0
0 голосов
/ 01 августа 2020
df_summary = (
    df_detail.groupby(['car_brand', 'car_type']).size()
    .unstack(fill_value=0)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...