2016-09-22 13 views
5

私はカテゴリー変数といくつかの数値変数を持つpandasデータフレームを持っています。このような何か:カテゴリに基づいて、pandasデータフレームの行を列に変換する方法は?

ls = [{'count':5, 'module':'payroll', 'id':2}, {'count': 53, 'module': 'general','id':2}, {'id': 5,'count': 35, 'module': 'tax'}, ] 
df = pd.DataFrame.from_dict(ls) 

DFは次のようになります。

df 
Out[15]: 
    count id module 
0  5 2 payroll 
1  53 2 general 
2  35 5  tax 

私はidで列とグループにモジュール変数(トランスポーズが正しい言葉です?)に変換します。だから、のようなもの:

これに対する1つのアプローチが適用されます使用することです
general_count id payroll_count tax_count 
0   53.0 2   5.0  NaN 
1   NaN 5   NaN  35.0 

  1. 高価な、そしてあまりにも多くの時間をとります。

    df['payroll_count'] = df.id.apply(lambda x: df[df.id==x][df.module=='payroll']) 
    

    はしかし、これは複数の欠点が

  2. アーチファクトを作成し、空の データフレームを作成します帽子をきれいにする必要があります。私が感じる

pandas groupbyでこれを達成するための良い方法ですが、より効率的に、この同じ操作への道を見つけることができません。助けてください。

+0

を使用することができます、最初の行の 'id'は2でなければなりません。 – IanS

+0

それを修正しました..指摘してくれてありがとう.. @ jezraelも素敵な答えを与えました。 –

答えて

5

groupbyは、最初に新しいindexと最後のcolumnを作成する列で使用できます。私はmeanを使用し、DataFrameSeriesに、DataFrame.squeezeに変換します(マルチインデクスのトップレベルを削除する必要はありません)。unstackで再フォーマットします。列名の最終add_suffixpivot

df = df.groupby(['id','module']).mean().squeeze().unstack().add_suffix('_count') 
print (df) 
module general_count payroll_count tax_count 
id            
2    53.0   5.0  NaN 
5     NaN   NaN  35.0 

別の解決策、そしてlist comprehensionして列からMultiindexを削除する必要があります。

df = df.pivot(index='id', columns='module') 
df.columns = ['_'.join((col[1], col[0])) for col in df.columns] 
print (df) 
    general_count payroll_count tax_count 
id           
2   53.0   5.0  NaN 
5    NaN   NaN  35.0 
+0

ありがとう.. groupbyは私の場合に完全に合った解決策です。ピボットは私がデータをクラスタリングしようとするときに問題を引き起こすかもしれません。そのgroupbyが他の人にどのように役立つかについての少しの説明。 –

+0

よろしくお願いします。 – jezrael

0

あなたが所望の出力で​​とunstack

In [2]: df.set_index(['id','module'])['count'].unstack().add_suffix('_count').reset_index() 
Out[2]: 
module id general_count payroll_count tax_count 
0  2   53.0   5.0  NaN 
1  5   NaN   NaN  35.0 
関連する問題