我的熊猫数据框的格式为
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个类别。
除了对数据框进行分组并“手动”遍历各组并填充单独的数据框之外,是否有其他方法可以对pyhton / pandas进行此操作?
答案 0 :(得分:6)
使用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
将数据框更改为宽格式。作为原始输出,数据透视表将为您在列上留下一个层次结构的索引,但是您可以将其展平以使列看起来像上面想要的那样。
# 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