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

そして私はplsはその後、データフレーム形式でこの出力を得ることができますか?見ていただきありがとうございます!

答えて

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 

EDIT:

ニード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 

mean(また、デフォルトでpivot_table aggreagate mean)を集約groupbyと別の高速化ソリューションは、DataFrame.squeezeによりSeriesに変換し、最後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

おかげでそんなに...私は2番目のものをチェックしてみましょう。最初の1つは私が試したことであり、私にこのエラーを与えました: 'ValueError:重複したエントリが含まれていて、再形成できないインデックス' – spiff

+0

input_.set_index(['Col1'、 'C​​ol3'])['Col2']。unstack() また与えます ValueError:インデックスに重複するエントリが含まれています.c annot reshape – spiff

+1

はい、私はより良い説明のためのリンクで別のソリューションを追加します。 – jezrael

関連する問題