2016-02-05 61 views
2

我有一個包含用戶ID,觀察日期一個數據幀DF(通常每季度頻率,但也可以是不規則的)和特徵值,例如:轉換爲每月在大熊貓數據幀

from util.Dates import Dates, to_date 
import pandas as pd 
df = pd.DataFrame(dict(
    RefIssuerId=[11590] * 3 + [115948] * 4, 
    AvailableDate=[to_date(d) for d in (20050613, 20050905, 20051214, 
        20040924, 20041101, 20050202,20050516)], 
     Characteristic=[0.06, 0.09, 0.07, 0.13, 0.09, 0.06, 0.04])) 

UserID  Date Characteristic 
115950 6/13/2005 0.06 
115950 9/5/2005 0.09 
115950 12/14/2005 0.07 
115948 9/24/2004 0.13 
115948 11/1/2004 0.09 
115948 2/2/2005 0.06 
115948 5/16/2005 0.04 

我正在嘗試將它上採樣到用戶組中的每月頻率。也就是說,希望得到這樣的不便(通過用戶名和日期排序)

UserID Date Characteristic month_date 
115950 6/13/2005 0.06 6/30/2005 
115950 6/13/2005 0.06 7/31/2005 
115950 6/13/2005 0.06 8/31/2005 
115950 9/5/2005 0.09 9/30/2005 
115950 9/5/2005 0.09 10/31/2005 
115950 9/5/2005 0.09 11/30/2005 
115950 12/14/2005 0.07 12/31/2005 
115950 12/14/2005 0.07 1/31/2006 
115950 12/14/2005 0.07 2/28/2006 
115948 9/24/2004 0.13 9/30/2004 
115948 9/24/2004 0.13 10/31/2004 
115948 11/1/2004 0.09 11/30/2004 
115948 11/1/2004 0.09 12/31/2004 
115948 11/1/2004 0.09 1/31/2005 
115948 2/2/2005 0.06 2/28/2005 
115948 2/2/2005 0.06 3/31/2005 
115948 2/2/2005 0.06 4/30/2005 
115948 5/16/2005 0.04 5/31/2005 
115948 5/16/2005 0.04 6/30/2005 
115948 5/16/2005 0.04 7/31/2005 

注意,因爲下一個可日期是11/1/2004,它在升取樣組產生的11/30/2004 month_date記錄115948 9/24/2004 0.13被上取樣只有兩次。

試戴GROUPBY數據幀施加重採樣:

newdf=df.groupby(['UserID']).resample("M",fill_method='ffill') 

但這並不產生所需的結果。任何指導/建議非常感謝。

+0

請張貼實際的代碼來創建樣本數據。有很多與你的問題相關的東西不能從你對數據框的模糊描述中推斷出來。 – Goyo

+0

我不明白最後2行輸出'df',你怎麼得到它。你能解釋一下嗎? – jezrael

回答

1

您可以使用resamplereset_index

import pandas as pd 

df_dg = pd.DataFrame(dict(
    UserID=[11590] * 3 + [115948] * 4, 
    Date=[20050613, 20050905, 20051214, 
        20040924, 20041101, 20050202,20050516], 
     Characteristic=[0.06, 0.09, 0.07, 0.13, 0.09, 0.06, 0.04]), columns=['UserID','Date','Characteristic']) 


df_dg['Date'] = pd.to_datetime(df_dg['Date'], format="%Y%m%d") 
print df_dg 
    UserID  Date Characteristic 
0 11590 2005-06-13   0.06 
1 11590 2005-09-05   0.09 
2 11590 2005-12-14   0.07 
3 115948 2004-09-24   0.13 
4 115948 2004-11-01   0.09 
5 115948 2005-02-02   0.06 
6 115948 2005-05-16   0.04 


df_dg['Date1'] = df_dg['Date'] 

newdf = df_dg.groupby('UserID').apply(lambda x: x.set_index('Date').resample('M', how='first',fill_method='ffill')).reset_index(drop=True, level=0).reset_index() 
newdf = newdf.rename(columns={'Date':'month_date', 'Date1':'Date'}) 
newdf = newdf[['UserID','Date','Characteristic','month_date']] 
print newdf 
    UserID  Date Characteristic month_date 
0 11590 2005-06-13   0.06 2005-06-30 
1 11590 2005-06-13   0.06 2005-07-31 
2 11590 2005-06-13   0.06 2005-08-31 
3 11590 2005-09-05   0.09 2005-09-30 
4 11590 2005-09-05   0.09 2005-10-31 
5 11590 2005-09-05   0.09 2005-11-30 
6 11590 2005-12-14   0.07 2005-12-31 
7 115948 2004-09-24   0.13 2004-09-30 
8 115948 2004-09-24   0.13 2004-10-31 
9 115948 2004-11-01   0.09 2004-11-30 
10 115948 2004-11-01   0.09 2004-12-31 
11 115948 2004-11-01   0.09 2005-01-31 
12 115948 2005-02-02   0.06 2005-02-28 
13 115948 2005-02-02   0.06 2005-03-31 
14 115948 2005-02-02   0.06 2005-04-30 
15 115948 2005-05-16   0.04 2005-05-31 
+0

它是如何工作的? – jezrael

+0

jezrael,太棒了,非常感謝...這似乎是工作...我知道我在重採樣語法做錯了。顯然,爲了重新採樣工作,在我可以應用重採樣方法之前,首先在組內設置日期索引是非常重要的。你認爲如果我首先將日期索引設置爲groupby框架對象(像df_dg.groupby('UserID').set_index('Date')那樣設置日期索引,然後對它使用.resample,這樣做會不會起作用?我不是100%肯定我理解你的例子中的apply方法...再次感謝 – denglu

+0

我認爲你必須在'apply'中使用'set_index',因爲'resample'只能用於'DatetimeIndex,TimedeltaIndex或PeriodIndex','apply'非常容易 - 它意味着獲取組和應用一些函數,通常使用'lambda'。 – jezrael