2017-06-17 3 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を作成し、2番目の3つの場合は再び同じように作成します。さらに、サイズが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 
関連する問題