2016-03-21 8 views
1

私はPython/Pandasを学ぼうとしており、かなり基本的な問題だと思っています。パンダのデータフレーム:値ではなく、サブグループ内の順序でアンスタック

私は次のような形式のデータを持っている:

 
id X 
1 1 
1 2 
2 2 
2 3 
3 4 
3 5 
3 5 
3 3 
3 3 
3 4 
4 3 
4 4 
4 6 

私はunstack形式に似たようなことで、データを変換したい:私はidによってグループ化する、X値をソート、最初Xを置きます値はx1であり、第2のX値はx2などです。データセットは相当に大きい(1ミリオンを超える)。 Xの値のほとんどはユニークです(したがって、私は列名としてXのの値を使用したくないが、のXの)を使用したくない。私は終わりだ後、私は、データフレームは、このように見えるで終わるしたいと思います:

 
id x1 x2 x3 
1 1 2 nan 
2 2 3 nan 
3 3 4 5 
4 3 4 6 
+0

を「流血について時間!"ちょっと変わっていませんが、編集するにはあまりにも遠すぎると思っていました。 –

+0

以下の議論から私の答え、私は今これが不明であることを示唆しなければなりません。 –

+0

ポイントを獲得しました。私は "血まみれの時間について"謝罪します。それを質問から削除しました。 –

答えて

0

IIUC、あなたはまず、

>>> df = df.drop_duplicates() 
>>> df = df.sort_values(["id", "X"]) 
>>> df["xcol"] = "x" + (df.groupby("id")["X"].rank().astype(int)).astype(str) 
>>> df = df.pivot(index="id", columns="xcol", values="X") 
>>> df 
xcol x1 x2 x3 
id    
1  1 2 NaN 
2  2 3 NaN 
3  3 4 5 
4  3 4 6 

ステップ・バイ・ステップのような何かを行うことができます(その後、我々はGROUPBYの要素をランク付けし、私たちが列に使用するつもり適切な値を構築することができます

>>> df = df.drop_duplicates() 
>>> df = df.sort_values(["id", "X"]) 
>>> df 
    X id 
0 1 1 
1 2 1 
2 2 2 
3 3 2 
7 3 3 
4 4 3 
5 5 3 
10 3 4 
11 4 4 
12 6 4 

を:私たちは、重複を削除してソートすることができます

>>> df["xcol"] = "x" + (df.groupby("id")["X"].rank().astype(int)).astype(str) 
>>> df 
    X id xcol 
0 1 1 x1 
1 2 1 x2 
2 2 2 x1 
3 3 2 x2 
7 3 3 x1 
4 4 3 x2 
5 5 3 x3 
10 3 4 x1 
11 4 4 x2 
12 6 4 x3 

をし、最終的に我々は、ピボット::cumcount)はここにも働いているだろう

>>> df = df.pivot(index="id", columns="xcol", values="X") 
>>> df 
xcol x1 x2 x3 
id    
1  1 2 NaN 
2  2 3 NaN 
3  3 4 5 
4  3 4 6 

あなたが主張している場合我々は、正確にご説明した出力形式を得ることができます:

>>> df.columns.name = None 
>>> df.reset_index() 
    id x1 x2 x3 
0 1 1 2 NaN 
1 2 2 3 NaN 
2 3 3 4 5 
3 4 3 4 6 
+0

すばらしい答えをありがとう!私が不思議に思ういくつかの事柄:まず、データにNANがあることがあるため、astype(int)は機能しません。代わりにfloatを使用しますが、新しい列namnesはx1.0 x2.0などであり、x1、x2ではありません。これを '修正'する方法はありますか?第二に、データ型はピボットによって保持されません。それはテキストになっていますが、実際にはdatetimes、浮動小数点または整数です。どうすればこの問題を解決できますか?再度、感謝します! –

関連する問題