2017-12-15 11 views
2

4列の行列です。私は最初の2つの列を維持し、最後の2つの列を発生行列の一種にしたい(しかし対応する値で)。私はgroupby ['shop_id'、 'item_id'、 'date']にしようとしましたが、空の日付の0をどのように埋めるのか分かりません。誰でもアイデアはありますか?多くのおかげでパンダ列を使ってオカレンス行列を作る方法

given: 
shop_id item_id date sales 
0  19  0 1 
0  19  2 13 
0  19  3 11 
1  19  1 3 

result: 
shop_id item_id date_0 date_1 date_2 date_3 
0  19  1  0  13  11 
1  19  0  3  0  0 
+0

おかげを使用して、私は(範囲(2,6)に私のために10 **(i))を異なるデータサイズのスコット、piSquaredとCOLDSPEEDからの解の集合を比較時間効率の点で大規模なデータセット(1,000,000行以上)で最小時間で実行されるunstack()メソッドが判明し、defaultdict()は小さなデータセット(10,000よりも大きい)で優れています。 pivot_table()の実行は、これらの2つのメソッドの中間にあります。 –

答えて

2

のは​​、unstackfillnaを使用してみましょう:

df.set_index(['shop_id','item_id','date'])['sales'].unstack()\ 
    .add_prefix('date_').reset_index().fillna(0).astype(int) 

は出力:

date shop_id item_id date_0 date_1 date_2 date_3 
0   0  19  1  0  13  11 
1   1  19  0  3  0  0 
+0

すごい!この優雅なソリューションに感謝します。 –

+0

@HanZhangこの回答を受け入れますか(https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work?answertab=votes#tab-top)。ありがとうございました。 –

+0

スタック/アンスタックはかなり非効率的であることに注意してください。 –

1

ここpivot_table解決策だが、本当に高速である必要があります -

df = df.pivot_table(
      index=['shop_id', 'item_id'], 
      columns=['date'], 
      values=['sales'], 
      fill_value=0)\ 
     .add_prefix('date_').reset_index() 

df 

    shop_id item_id date_sales      
date      date_0 date_1 date_2 date_3 
0   0  19   1  0  13  11 
1   1  19   0  3  0  0 

どちらのソリューションを使用するかを決める前に、両方のソリューションをデータでテストしてください。

2

すべての答えのためのdefaultdict

import pandas as pd 
from collections import defaultdict 

d = defaultdict(dict) 
for (shop, item, date, sales) in df.values.tolist(): 
    d[date][(shop, item)] = sales 

pd.DataFrame(d).fillna(0, downcast='infer') \ 
    .add_prefix('date_').rename_axis(['shop_id', 'item_id']).reset_index() 

    shop_id item_id date_0 date_1 date_2 date_3 
0  0  19  1  0  13  11 
1  1  19  0  3  0  0 
関連する問題