在python数据帧中转置一列

时间:2016-11-10 14:11:41

标签: python pandas dataframe transpose

我有以下内容:

tableViewController

我想转置列ID,然后使用以下内容:

Index  ID     speed  _avg_val
245    1      10      30.5
246    1      2       25.1

我尝试使用此方法Transposing one column in python pandas with the simplest index possible但无法使用此方法来处理多个列。

1 个答案:

答案 0 :(得分:2)

我认为您可以先删除列Index,然后将列ID添加到indexunstack,并按列sort_index对列中的第二级MultiIndex进行排序:

print (df)
   Index  ID  speed  _avg_val
0    245   1     10      30.5
1    246   1      2      25.1


df = df.drop('Index', axis=1)
       .set_index('ID', append=True)
       .unstack(0)
       .sort_index(axis=1, level=1)

#remove MultiIndex from columns
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns]

print (df)
    speed_0  _avg_val_0  speed_1  _avg_val_1
ID                                          
1        10        30.5        2        25.1

如果ID列中有更多值,则需要使用cumcount

print (df)
   Index  ID  speed  _avg_val
0    245   1     10      30.5
1    246   1      2      25.1
2    245   2      5      37.5
3    246   2     28      28.1
4    246   2     27      23.0

df = df.drop('Index', axis=1)
df['g'] = df.groupby('ID').cumcount()
df = df.set_index(['ID', 'g']).unstack(fill_value=0).sort_index(axis=1, level=1)
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns]

print (df)
    speed_0  _avg_val_0  speed_1  _avg_val_1  speed_2  _avg_val_2
ID                                                               
1        10        30.5        2        25.1        0         0.0
2         5        37.5       28        28.1       27        23.0