#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