2017-04-13 11 views
2

私は、顧客が購入する速度に興味 列でグループ化して日付を再サンプリングできますか?

CustomerID InvoiceDate 
13654.0  2011-07-17 13:29:00 
14841.0  2010-12-16 10:28:00 
19543.0  2011-10-18 16:58:00 
12877.0  2011-06-15 13:34:00 
15073.0  2011-06-06 12:33:00 

のように見えるいくつかの消費者の購入データを持っています。各顧客ごとにグループ化し、各四半期に購入した購入数を確認したいとします(各四半期は1月から3ヶ月ごととしましょう)。

各四半期の開始と終了を定義して別の列を作成することができます。私は同じことを達成するために代わりにgroupbyを使用できるかどうか疑問に思っています。

現在、これは私がそれを行う方法です。

r = data.groupby('CustomerID') 

frames = [] 
for name,frame in r: 

    f =frame.set_index('InvoiceDate').resample("QS").count() 

    f['CustomerID']= name 

    frames.append(f) 


g = pd.concat(frames) 

答えて

2

UPDATE:

In [43]: df.groupby(['CustomerID', pd.Grouper(key='InvoiceDate', freq='QS')]) \ 
      .size() \ 
      .reset_index(name='Count') 
Out[43]: 
    CustomerID InvoiceDate Count 
0  12877.0 2011-04-01  1 
1  13654.0 2011-07-01  1 
2  14841.0 2010-10-01  1 
3  15073.0 2011-04-01  1 
4  19543.0 2011-10-01  1 

これは何ですかほしい?

In [39]: df.groupby(pd.Grouper(key='InvoiceDate', freq='QS')).count() 
Out[39]: 
      CustomerID 
InvoiceDate 
2010-10-01   1 
2011-01-01   0 
2011-04-01   2 
2011-07-01   1 
2011-10-01   1 
+0

閉じます。私はまた、顧客IDでグループ化したい。私はそれを行う方法を見つけた、ありがとう。 –

+0

@DemetriP、答えを更新しました - – MaxU

+0

を確認してください。ありがとう! –

0

私は、これは私が行うことができるようになります最善であると思う:

data.groupby('CustomerID').apply(lambda x: x.set_index('InvoiceDate').resample('QS').count()) 
0

使用pd.TimeGrouper

df = df.set_index('InvoiceDate') 
df.index = pd.to_datetime(df.index) 
df.groupby(['CustomerID',pd.TimeGrouper(freq='QS')]).size().reset_index().rename(columns={0:'Num_Invoices'}) 

CustomerID InvoiceDate Num_Invoices 
0  12877.0 2011-04-01  1 
1  13654.0 2011-07-01  1 
2  14841.0 2010-10-01  1 
3  15073.0 2011-04-01  1 
4  19543.0 2011-10-01  1 
関連する問題