2017-09-24 180 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))]