2016-06-22 6 views
2

レシートの明細を列として移動するには、Pandas pivot_tableを使用してレシートごとに1行しか残さないようにしています。私の主な課題は、新しい列の名前を必要に応じて数え、NaNで満たすことです。Pandas Pivotテーブルインクリメンタルカラム名

私はこれにしようとしています

customer_id receipt_id item_id 
01   100  420 
05   400  450 
05   400  460 
05   400  320 
05   400  270 
02   300  320 
02   300  460 
05   200  220 

...次のようになります。

customer_id receipt_id 1  2  3  4 n.. 
01   100   420 NaN NaN NaN 
05   400   450 460 320 270 
02   300   320 460 NaN NaN 
05   200   220 NaN NaN Nan 

私はそれを動作させるためにしようとしているが、私は近くにないです。

pt = pd.pivot_table(df, values=["item_id"], index=["customer_id", "receipt_id"], columns=["item_id"], fill_value="NaN").reset_index() 

答えて

1

私はあなたが列名を作成するためのcumcountを必要とし、パラメータvaluesから[]を削除すると思う:

df['g'] = df.groupby(['customer_id','receipt_id'])['item_id'].cumcount() + 1 

pt = pd.pivot_table(df, 
        values="item_id", 
        index=["customer_id", "receipt_id"], 
        columns="g", 
        fill_value="NaN").reset_index() 

print (pt) 

g customer_id receipt_id 1 2 3 4 
0   1   100 420 NaN NaN NaN 
1   2   300 320 460 NaN NaN 
2   5   200 220 NaN NaN NaN 
3   5   400 450 460 320 270 
+0

Jezraelありがとうございました!あなたのソリューションは完璧に機能しました。レシートあたり平均2個の33M行で、58 GB RAMを使用して20分で実行されました。領収書の中には、最大30個のアイテムがあります。私はすべての列番号を落としました。 – user6453877

+0

うれしいことがあなたを助けることができます!いい日! – jezrael

1

代替ソリューション(それが遅くなるかもしれない - 私はタイミングをテストしていない):

In [243]: df.groupby(['customer_id','receipt_id'])['item_id'].apply(list).apply(pd.Series).reset_index() 
Out[243]: 
    customer_id receipt_id  0  1  2  3 
0   1   100 420.0 NaN NaN NaN 
1   2   300 320.0 460.0 NaN NaN 
2   5   200 220.0 NaN NaN NaN 
3   5   400 450.0 460.0 320.0 270.0