2017-06-17 176 views
6

在大熊貓如何從去:重塑行列大熊貓數據幀

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
>>> a 
    bar foo 
0 1 m 
1 2 m 
2 3 m 
3 4 s 
4 5 s 
5 6 s 

到B:

b = pd.DataFrame({'m': [1, 2, 3], 
        's': [4, 5, 6]}) 
>>> b 
    m s 
0 1 4 
1 2 5 
2 3 6 

我試圖在其他的答案,例如解決方案herehere,但似乎沒有做我想要的。

基本上,我想交換行的列和刪除索引,但如何做到這一點?

回答

5
a.set_index(
    [a.groupby('foo').cumcount(), 'foo'] 
).bar.unstack() 
+0

您能詳細一點這是怎麼回事?我查看了GroupBy.cumcount()文檔,但它有點神祕。 – PedroA

+1

我對缺乏細節表示歉意。我在打電話。您擁有的信息存在的問題是您需要使用相同的foo值區分不同的值。 Cumcount通過爲第一個3創建一個0,1和2,並且爲第二個三個創建一個。更重要的是,如果它們的大小不是3,那麼它就會起作用。鑑於我設置索引的位置,它完全適用於拆散。 – piRSquared

+0

@piRSquared謝謝你,另外瞭解set_index – Wen

3

這是我的解決方案

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values)) 

foo m s 
0 1.0 4.0 
1 2.0 5.0 
2 3.0 6.0