Преобразование фрейма данных pandas — преобразование некоторых значений строк в столбцы

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных pandas вида

 advert_id     run_id         category       score
    11111111         78              842    0.356975
    11111111         78              849    0.245583
    11111111         78              950    0.089219
    11111111         78             1645    0.089172
    11111111         78             2494    0.044254
        ...        ...              ...         ...
    22222222    1083267             2521    0.078275
    22222222    1083267             2553    0.121556
    22222222    1083267             2872    0.039226
    22222222    1083267             3045    0.362127
    22222222    1083267             3049    0.040135
  

И хотел бы преобразовать его в фрейм данных формы (теперь по одной строке на advert_id):

 advert_id     run_id      category_1     score_1    category_2     score_2     category_3     score_3  ... category_n  score_n
 11111111         78             842    0.356975           849    0.245583            950    0.089219  ... 
 22222222    1083267            2521    0.078275          2553    0.121556           2872    0.039226  ...
  

Количество категорий в объявлении может варьироваться, некоторые объявления могут содержать 1 .. n категорий.

Есть ли элегантный способ сделать это с помощью python / pandas, кроме группировки фрейма данных и «ручного» перебора групп и заполнения отдельного фрейма данных?

Ответ №1:

После создания дополнительного ключа с cumcount

 df['key2']=(df.groupby('advert_id').cumcount() 1)

s=df.set_index(['advert_id','run_id','key2']).unstack().sort_index(level=1,axis=1)
s.columns=s.columns.map('{0[0]}_{0[1]}'.format)
s
Out[59]: 
                   category_1   score_1  ...  category_5   score_5
advert_id run_id                         ...                      
11111111  78              842  0.356975  ...        2494  0.044254
22222222  1083267        2521  0.078275  ...        3049  0.040135
[2 rows x 10 columns]
  

Комментарии:

1. это было быстро и разумно. 🙂

Ответ №2:

Вы могли бы использовать pivot для изменения фрейма данных в широкий формат. На исходном выходе pivot предоставит вам иерархический индекс по столбцам, но вы можете сгладить его, чтобы столбцы выглядели так, как вы хотели выше.

 # add a key as in solution above from BEN_YO
df['temp_key']=(df.groupby('advert_id').cumcount() 1)
# do the pivot
df = df.pivot(index='advert_id', columns="temp_key", values=["category", "score"])
# make the columns look as expected
df.columns = [' '.join(col).strip() for col in df.columns.values]
print(df.head())
  

Результат соответствует желаемому:

            category 1  category 2  category 3  ...    score 4   score 5 
advert_id                                      ...                      
11111111        842.0       849.0       950.0  ...    0.089172  0.044254 
22222222       2521.0      2553.0      2872.0  ...    0.362127  0.040135