2015-11-25 64 views
4

有兩個數據幀。首先是這樣的:熊貓每天計算最近7天的值

print df1 

     id  date month is_buy 
    0 17 2015-01-16 2015-01  1 
    1 17 2015-01-26 2015-01  1 
    2 17 2015-01-27 2015-01  1 
    3 17 2015-02-11 2015-02  1 
    4 17 2015-03-14 2015-03  1 
    5 18 2015-01-28 2015-01  1 
    6 18 2015-02-12 2015-02  1 
    7 18 2015-02-25 2015-02  1 
    8 18 2015-03-04 2015-03  1 

第二數據幀中有按月從第一個部分彙總數據:

df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).agg({'is_buy': np.sum}) 

print df2 

     id month  buys 
    0 17 2015-01   3 
    1 17 2015-02   1 
    2 17 2015-03   1 
    3 18 2015-01   1 
    4 18 2015-02   2 
    5 18 2015-03   1 

我試圖讓一個名爲「last_week_buys」與聚合新DF2列從每個df1 ['月']的第一天起最後7天購買。換句話說,我希望得到這樣的:

 id month  buys last_week_buys 
    0 17 2015-01   3    NaN 
    1 17 2015-02   1     2 
    2 17 2015-03   1     0 
    3 18 2015-01   1    NaN 
    4 18 2015-02   2     1 
    5 18 2015-03   1     1 

是否有任何想法,讓此列?

+0

取決於您如何定義上個月的最後一週(最後7天?,最後5個交易日等),應該很容易計算上個星期每月的購買次數,然後只需將此係列與隨後的月份對齊即可。 –

+0

@凱文斯,是的,需要計算最後的7天購買。我試圖按df1分組數據,不僅每個月,而且每年的一週,但注意到,這個日曆周可以包括1或2天......但我絕對需要7天。 –

回答

2

這可以用一個比特的日期操作魔術和分組依據來完成:

# datetimeindex makes convenient manipulations 
date = pd.DatetimeIndex(df1['date']) 

# compute df2: totals by month 
df1['month'] = date.to_period('M') 
df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).sum() 

# compute df3: totals by last seven days 
from datetime import timedelta 
is_last_seven = date.to_period('M') != (date + timedelta(days=7)).to_period('M') 
df3 = df1[(df1['is_buy'] == 1) & is_last_seven].groupby(['id', df1.month + 1]).sum() 

# join the results 
result = df2.join(df3, rsuffix='_last_seven') 

下面是結果:

>>> print(result) 

      is_buy is_buy_last_seven 
id month        
17 2015-01  3    NaN 
    2015-02  1     2 
    2015-03  1    NaN 
18 2015-01  1    NaN 
    2015-02  2     1 
    2015-03  1     1 

,你的願望然後,您可以填寫NaN值。

+0

這正是我想要的,非常感謝! –

+0

,如果它不會使你複雜化 - 我如何獲得唯一購買日期的數量?我嘗試使用.agg({'is_buy':np.sum,'date':lambda x:x.nunique()}) 但是這個變體是錯誤的(在'date'列中,我有'1970' -01 00:00:00.000000002'或NaT)@jakevdp –

+0

您可以嘗試使用類似''df1 ['date'] = pd.DatetimeIndex(df1 ['date'])。to_period('D ')'' – jakevdp