2016-10-03 114 views
1

這可能是一個簡單的使用樞軸,但由於我沒有添加數字(每行都是唯一的),我應該如何去做這件事?熊貓重新排序數據

輸入:

 Col1 Col2 Col3 
0 123.0 33.0 ABC 
1 345.0 39.0 ABC 
2 567.0 100.0 ABC 
3 123.0 82.0 PQR 
4 345.0 10.0 PQR 
5 789.0 38.0 PQR 
6 890.0 97.0 XYZ 
7 345.0 96.0 XYZ 

輸出:

 Col1 ABC PQR XYZ 
0 123.0 33.0 82.0 NaN 
1 345.0 39.0 10.0 96.0 
2 567.0 100.0 NaN NaN 
3 789.0 NaN 38.0 NaN 
4 890.0 NaN NaN 97.0 

而且我可以得到數據幀格式,此輸出則請?非常感謝您的關注!

回答

2

您可以使用pivot

print (df.pivot(index='Col1', columns='Col3', values='Col2')) 
Col3  ABC PQR XYZ 
Col1      
123.0 33.0 82.0 NaN 
345.0 39.0 10.0 96.0 
567.0 100.0 NaN NaN 
789.0 NaN 38.0 NaN 
890.0 NaN NaN 97.0 

另一種解決方案與set_indexunstack:通過評論

print (df.set_index(['Col1','Col3'])['Col2'].unstack()) 
Col3  ABC PQR XYZ 
Col1      
123.0 33.0 82.0 NaN 
345.0 39.0 10.0 96.0 
567.0 100.0 NaN NaN 
789.0 NaN 38.0 NaN 
890.0 NaN NaN 97.0 

編輯:

需要pivot_table

print (df.pivot_table(index='Col1', columns='Col3', values='Col2')) 
Col3  ABC PQR XYZ 
Col1      
123.0 33.0 82.0 NaN 
345.0 39.0 10.0 96.0 
567.0 100.0 NaN NaN 
789.0 NaN 38.0 NaN 
890.0 NaN NaN 97.0 

groupby另一種更快的解決方案,聚集mean(默認情況下pivot_table aggreagate mean也),轉換成SeriesDataFrame.squeeze和最後unstack

print (df.groupby(['Col1','Col3']).mean().squeeze().unstack()) 
Col3  ABC PQR XYZ 
Col1      
123.0 33.0 82.0 NaN 
345.0 39.0 10.0 96.0 
567.0 100.0 NaN NaN 
789.0 NaN 38.0 NaN 
890.0 NaN NaN 97.0 
+0

感謝這麼多..讓我檢查:第二個。 。第一個是我嘗試給我的錯誤:'ValueError:索引包含重複的條目,無法重新塑造' – spiff

+0

input_.set_index(['Col1','Col3'])['Col2']。unstack() 也給出 ValueError:索引包含重複的條目,c annot整形 – spiff

+1

是的,所以我添加了另一個鏈接解決方案,以獲得更好的解釋。 – jezrael