2016-10-03 71 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