2017-09-24 179 views
2

给出的数据帧熊猫数据框 - 列转

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 

提前感谢!

回答

3

您可以使用拆散

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

'df1.columns.map(拉姆达×: '{1} - {0}' 格式(* X))'将不需要'swaplevel' – Zero

+0

@Zero,是的。将它添加到答案中。谢谢:) – Vaishali

2

您可以简单地使用旋转功能:

df2 = df.pivot(index='user', columns='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获得valueX用户889你需要做的:df2.loc[889, ('valueX', '2013-01')],或者所有日期:df2.loc[889, ('valueX', slice(None))]