Pandas数据帧 - 列转置

时间:2017-09-24 23:20:44

标签: python pandas

给出数据框

user month      valueX   valueY
--------------------------------
884  2013-01    1        5
889  2013-02    0        15
884  2013-02    7        29
889  2013-01    9        38

我怎样才能找到这个:

user |2013-01-valueX |2013-02-valueX  |2013-01-valueY  |2013-02-valueY
--------------------------------------------------------------------
884  |1              |7               |5               |19
889  |9              |0               |38              |15

提前致谢!

2 个答案:

答案 0 :(得分:3)

您可以使用unstack

df1 = df.set_index(['user', 'month'])[['valueX', 'valueY']].unstack()
df1.columns = df1.columns.swaplevel().map('-'.join)
df1 = df1.reset_index()

    user    2013-01-valueX  2013-02-valueX  2013-01-valueY  2013-02-valueY
0   884     1               7               5               29
1   889     9               0               38              15

编辑:正如@Zero建议的那样,您可以组合多索引列而不使用像这样的swaplevel(),

df.columns = df1.columns.map('{0[1]}-{0[0]}'.format) 

答案 1 :(得分:2)

您只需使用数据透视功能:

df2 = df.pivot(index='user', columns='month')

根据'user'对行进行分组,并根据'month'对列进行分组。

结果是:

     valueX          valueY        
month 2013-01 2013-02 2013-01 2013-02
user                                 
884         1       7       5      29
889         9       0      38      15

注意:这些列现在是一个多级索引,例如,要在2013-01上获取用户889的valueX,您需要执行:df2.loc[889, ('valueX', '2013-01')]或所有日期:df2.loc[889, ('valueX', slice(None))]