2017-08-07 9 views
1

塗りつぶし:パンダピボット列と私はDFを持っている別のピボット済み列

id step step_description stepA stepA_description date 
1  1  Start    1  Beginning   8/6/2017 
1  2  Continue   2  Middle    8/7/2017 
1  3  Finish    3  End     8/7/2017 

私はそれが次のようになりますので、このデータをピボットしたい:

id step1 step2 step3 stepA1 stepA2 stepA3 step1_date step2_date step3_date 
1  Start Continue Finish Beginning Middle End  8/6/2017 8/7/2017 8/7/2017 

このステップ列を意味し、旋回され、次に別の旋回柱で満たされなければならない。パンダでこれを達成する方法はありますか?ピボットオプションのドキュメントを読んだことがあります(これまでのより単純なケースではいくつかのオプションを使用していました)が、これを実現する方法を解読できませんでした。

ピボットテーブルを使用して、必要な構造を持つ複数レベルのインデックスを取得できます。階層の下端がdfの値になるようにインデックスを本質的に「落とす」方法はありますか?

ありがとうございました!

答えて

2

あなたは2つのソリューションを使用することができます - pivotunstackを使用します。

df1 = df.pivot(index='id', columns='step', values='step_description').add_prefix('step') 
print (df1) 
step step1  step2 step3 
id       
1  Start Continue Finish 

df1 = df.set_index(['id', 'step'])['step_description'].unstack().add_prefix('step') 
print (df1) 
step step1  step2 step3 
id       
1  Start Continue Finish 

しかし、重複の場合、groupbyapplypivot_tableまたは集約を必要とする参加:

print (df) 
    id step step_description 
0 1  1   Start<-Same id=1, step=1 
1 1  1   Start1<-Same id=1, step=1 
2 1  2   Continue 
3 1  3   Finish 

df2=df.pivot_table(index='id', 
        columns='step', 
        values='step_description', 
        aggfunc=', '.join).add_prefix('step') 
print (df2) 
step   step1  step2 step3 
id         
1  Start, Start1 Continue Finish 

df2=df.groupby(['id', 'step'])['step_description'].apply(','.join) 
                .unstack().add_prefix('step') 
print (df2) 
step   step1  step2 step3 
id         
1  Start,Start1 Continue Finish 

EDIT:あなたは2 DataFrame秒を必要とする

、その後concatそれら:

別に
cols = ['id','step','step_description','date'] 
df1 = df[cols].set_index(['id', 'step']).unstack().rename(columns={'step_description':'des'}) 
df1.columns = ['step{}_{}'.format(x[1], x[0]) for x in df1.columns] 
print (df1) 
    step1_des step2_des step3_des step1_date step2_date step3_date 
id                
1  Start Continue Finish 8/6/2017 8/7/2017 8/7/2017 

df2 = df.set_index(['id', 'stepA'])['stepA_description'].unstack().add_prefix('stepA') 
print (df2) 
stepA  stepA1 stepA2 stepA3 
id        
1  Beginning Middle End 

df = pd.concat([df1, df2], axis=1).reset_index() 
print (df) 
    id step1_des step2_des step3_des step1_date step2_date step3_date \ 
0 1  Start Continue Finish 8/6/2017 8/7/2017 8/7/2017 

     stepA1 stepA2 stepA3 
0 Beginning Middle End 
+0

ありがとうを使用することができます!最初の行は完全に動作します。インデックスを設定すると 'id'にキーエラーが発生します。また、複数のフィールドインデックスを作成することはできません。私はそれが私が求めたものではないことを知っています! –

+0

ありがとう、もう一度。ピボットテーブル方式は、マルチフィールドインデックスも可能にします。ミックスに別の2つの列を組み込むことがどれほど難しいと思いますか?例えば、 'step_2'と' step_description_2'を追加した場合、ピボットテーブルに追加された別の3つのカラムが必要ですか?あるいは、それぞれのピボットを別々に行い、dfsに戻って一緒に参加する方が簡単でしょうか? –

+0

時間をください。 – jezrael

0

pivotと​​方法から、あなたもgroupby

df.groupby(['id', 'step'])['step_description'].sum().unstack().add_prefix('step' 
+0

ありがとう、ジョン!このメソッドで複数のフィールドインデックスを許可する方法を知っていますか?たとえば、 'id2'と呼ばれる別のフィールドがあり、これもすべてのレコードで同じです。 –

関連する問題