转换熊猫数据框-将一些行值转换为列

时间:2020-08-14 13:27:38

标签: python 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个类别。

除了对数据框进行分组并“手动”遍历各组并填充单独的数据框之外,是否有其他方法可以对pyhton / pandas进行此操作?

2 个答案:

答案 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