Как получить преобразованный фрейм данных путем группировки по одному столбцу и сопоставления по другому в Pandas

#python #pandas

Вопрос:

У меня есть фрейм данных Pandas, подобный следующему

 col_a            col_b     col_c
2021-05-01        1           30
2021-05-01        3           40
2021-05-01        2           60
2021-05-02        1           70
2021-05-02        2           10
2021-05-02        3           20
 

И я хочу сделать это в следующем фрейме данных (т. Е. Добавить n новые столбцы на основе количества различных типов в col_b столбце в исходном фрейме данных, а затем сопоставить их на основе col_a для заполнения значений)

 col_a                 type_1   type_2     type_3
2021-05-01                30      60        40   
2021-05-02                70      10        20
 

Не могли бы вы мне помочь, пожалуйста?

Ответ №1:

Вы можете использовать pivot :

 df = df.pivot(*df).add_prefix('type_')
 

Для дальнейшего преобразования в требуемую структуру используйте:

 df = df.pivot(*df).add_prefix('type_').rename_axis(None, axis= 1).reset_index()
 

OUTPUT :

         col_a  type_1  type_2  type_3
0  2021-05-01      30      60      40
1  2021-05-02      70      10      20
 

Еще один set_index / unstack вариант:

 df = df.set_index(['col_a','col_b']).unstack().add_prefix('type_')
df.columns = df.columns.droplevel()
 

Ответ №2:

Вы можете использовать .pivot() и затем .add_prefix() для имен столбцов. Очистите имя оси столбца по .rename_axis() и , наконец .reset_index() , следующим образом:

 df = (df.pivot(index='col_a', columns='col_b', values='col_c')
        .add_prefix('type_')
        .rename_axis(columns=None)
        .reset_index()
     )
 

Результат:

         col_a  type_1  type_2  type_3
0  2021-05-01      30      60      40
1  2021-05-02      70      10      20