2017-04-17 41 views
2

列我有一個DF與我想從行轉換爲列我看到的堆棧溢出大部分的解決方案只有2列Python的大熊貓轉換行到多列存在

From DF

PO ID PO Name Region Date Price 
1  AA  North 07/2016 100 
2  BB  South 07/2016 200 
1  AA  North 08/2016 300 
2  BB  South 08/2016 400 
1  AA  North 09/2016 500 
處理多列

To DF

PO ID PO Name Region 07/2016 08/2016 09/2016 
1  AA  North 100  300  500 
2  BB  South 200  400  NaN 
+0

這就是所謂的旋轉或拆垛。關於這個 –

+0

哦,我已經搜索了很多關於轉換列的問題,大多數問題只處理了2列,因爲我有多個列。任何如何在發佈前閱讀更多內容。 –

回答

3

使用set_indexunstack

df = df.set_index(['PO ID','PO Name','Region', 'Date'])['Price'].unstack() 
print (df) 
Date     07/2016 08/2016 09/2016 
PO ID PO Name Region       
1  AA  North  100.0 300.0 500.0 
2  BB  South  200.0 400.0  NaN 

如果重複需要pivot_tablegroupby聚合函數:

print (df) 
    PO ID PO Name Region  Date Price 
0  1  AA North 07/2016 100 <-for PO ID;PO Name;Region;Date different Price 
1  1  AA North 07/2016 500 <-for PO ID;PO Name;Region;Date different Price 
2  2  BB South 07/2016 200 
3  1  AA North 08/2016 300 
4  2  BB South 08/2016 400 
5  1  AA North 09/2016 500 

df = df.pivot_table(index=['PO ID','PO Name','Region'], 
        columns='Date', 
        values='Price', 
        aggfunc='mean') 
print (df) 
Date     07/2016 08/2016 09/2016 
PO ID PO Name Region       
1  AA  North  300.0 300.0 500.0 <-(100+500)/2=300 for 07/2016 
2  BB  South  200.0 400.0  NaN 

df = df.groupby(['PO ID','PO Name','Region', 'Date'])['Price'].mean().unstack() 
print (df) 
Date     07/2016 08/2016 09/2016 
PO ID PO Name Region       
1  AA  North  300.0 300.0 500.0 <-(100+500)/2=300 for 07/2016 
2  BB  South  200.0 400.0  NaN 

末:

df = df.reset_index().rename_axis(None).rename_axis(None, axis=1) 
print (df) 
    PO ID PO Name Region 07/2016 08/2016 09/2016 
0  1  AA North 300.0 300.0 500.0 
1  2  BB South 200.0 400.0  NaN 
+0

我試過groupby的第三個解決方案,因爲set_index對實際數據有重複的影響 –

+0

還有一些問題?如果是的話,你能解釋一下嗎? – jezrael

+0

第三個解決方案工作得很好。第一個解決方案出錯。 ValueError:索引包含重複條目,無法重塑 –