2016-07-22 31 views
3

我認爲這是一個非常簡單的問題。我是python的新手,我無法找到完美的答案。在Python中從長轉換爲寬

我有一個數據幀:

A   B  C  D  E 
203704  WkDay 00:00 0.247 2015 
203704  WkDay 00:30 0.232 2015 
203704  Wkend 00:00 0.102 2015 
203704  Wkend 00:30 0.0907 2015 
203704  WkDay 00:00 0.28 2016 
203704  WkDay 00:30 0.267 2016 
203704  Wkend 00:00 0.263 2016 
203704  Wkend 00:30 0.252 2016 

我需要:

A  B  00:00 00:30 E 
203704 Wkday 0.247 0.232 2015 
203704 Wkend 0.102 0.0907 2015 
203704 Wkday 0.28 0.267 2016 
203704 Wkday 0.263 0.252 2016 

我已經通過像thisthis各個環節不見了。但是,實施他們我收到各種錯誤。

我能夠運行這個成功

pandas.pivot_table(df,values='D',index='A',columns='C') 

,但它沒有給出正是我想要的。

對此的任何幫助將有所幫助。

回答

4

您可以添加多個列列爲參數index的說法:

print (pd.pivot_table(df,index=['A', 'B', 'E'], columns='C',values='D').reset_index()) 
C  A  B  E 00:00 00:30 
0 203704 WkDay 2015 0.247 0.2320 
1 203704 WkDay 2016 0.280 0.2670 
2 203704 Wkend 2015 0.102 0.0907 
3 203704 Wkend 2016 0.263 0.2520 

如果需要更改列的順序:

#reset only last level of index 
df1 = pd.pivot_table(df,index=['A', 'B', 'E'], columns='C',values='D').reset_index(level=-1) 
#reorder first column to last 
df1.columns = df1.columns[-1:] | df1.columns[:-1] 
#reset other columns 
print (df1.reset_index()) 
C  A  B 00:00 00:30  E 
0 203704 WkDay 2015 0.247 0.2320 
1 203704 WkDay 2016 0.280 0.2670 
2 203704 Wkend 2015 0.102 0.0907 
3 203704 Wkend 2016 0.263 0.2520 
+0

我看不錯+1 – piRSquared

+0

@piRSquared - 謝謝。我仍然想知道你的答案中的圖片;)你的風格是美好的,很好看,但不殺時間?或者一些腳本可以幫助你? – jezrael

+1

在我的Mac上,它的一個快速命令+ shift + ctrl + 4,然後拖動和圖片在剪貼板中。否則,將其拖到文本上,命令+ C,命令+ V,重新格式化爲代碼。要點是,我覺得它更快。 – piRSquared

2

使用​​和unstack

df.set_index(['A', 'B', 'E', 'C']).D.unstack().reset_index() 

enter image description here

如果你堅持的確切格式

df.set_index(['A', 'B', 'E', 'C']) \ 
    .D.unstack().reset_index() \ 
    .rename_axis(None, 1).iloc[:, [0, 1, 3, 4, 2]] 

enter image description here

+0

謝謝@piRSquared也可以。 –