2013-10-22 12 views
5

我有一個帶有兩級分層索引('item_id'和'date')的熊貓數據框。每行有特定月份中特定項目的各種指標的列。這裏有一個例子:在大熊貓的層次索引的一個級別上重新編譯和填充

    total_annotations unique_tags 
date  item_id 
2007-04-01 2      30   14 
2007-05-01 2      32   16 
2007-06-01 2      36   19 
2008-07-01 2      81   33 
2008-11-01 2      82   34 
2009-04-01 2      84   35 
2010-03-01 2      90   35 
2010-04-01 2      100   36 
2010-11-01 2      105   40 
2011-05-01 2      106   40 
2011-07-01 2      108   42 
2005-08-01 3      479   200 
2005-09-01 3      707   269 
2005-10-01 3      980   327 
2005-11-01 3      1176   373 
2005-12-01 3      1536   438 
2006-01-01 3      1854   497 
2006-02-01 3      2206   560 
2006-03-01 3      2558   632 
2007-02-01 3      5650   1019 

正如你所看到的,有沒有爲每個項目的所有連續兩個月的觀察。我想要做的是對數據框進行重新索引,使每個項目在指定範圍內每個月都有行。現在,對於任何特定物品來說,這都很容易完成。因此,對於ITEM_ID 99,例如:

baseDateRange = pd.date_range('2005-07-01','2013-01-01',freq='MS') 
data.xs(99,level='item_id').reindex(baseDateRange,method='ffill') 

但是用這種方法,我必須通過所有的ITEM_IDS迭代,然後合併一切融合在一起,這似乎遠遠過於複雜。

那麼我該如何將這個應用到完整的數據框,填充觀察結果(還包括item_id索引),以便每個item_id都能正確填充baseDateRange中所有日期的行?

回答

5

基本上爲每個組,你想重新索引和填充。 apply會傳遞一個數據框,該數據框的item_id和日期仍在索引中,因此重置,然後設置並重新填充索引。 idx是您上面的baseDateRange。

In [33]: df.groupby(level='item_id').apply(
     lambda x: x.reset_index().set_index('date').reindex(idx,method='ffill')).head(30) 
Out[33]: 
        item_id annotations tags 
item_id          
2  2005-07-01  NaN   NaN NaN 
     2005-08-01  NaN   NaN NaN 
     2005-09-01  NaN   NaN NaN 
     2005-10-01  NaN   NaN NaN 
     2005-11-01  NaN   NaN NaN 
     2005-12-01  NaN   NaN NaN 
     2006-01-01  NaN   NaN NaN 
     2006-02-01  NaN   NaN NaN 
     2006-03-01  NaN   NaN NaN 
     2006-04-01  NaN   NaN NaN 
     2006-05-01  NaN   NaN NaN 
     2006-06-01  NaN   NaN NaN 
     2006-07-01  NaN   NaN NaN 
     2006-08-01  NaN   NaN NaN 
     2006-09-01  NaN   NaN NaN 
     2006-10-01  NaN   NaN NaN 
     2006-11-01  NaN   NaN NaN 
     2006-12-01  NaN   NaN NaN 
     2007-01-01  NaN   NaN NaN 
     2007-02-01  NaN   NaN NaN 
     2007-03-01  NaN   NaN NaN 
     2007-04-01  2   30 14 
     2007-05-01  2   32 16 
     2007-06-01  2   36 19 
     2007-07-01  2   36 19 
     2007-08-01  2   36 19 
     2007-09-01  2   36 19 
     2007-10-01  2   36 19 
     2007-11-01  2   36 19 
     2007-12-01  2   36 19 
+0

真棒,但有兩個澄清:首先,你已經這樣做了,我留下的ITEM_ID指數的頂部冗餘ITEM_ID列。然而,看來我可以通過修改你的代碼來處理'df.groupby(level ='item_id')。apply(lambda x:x.reset_index(level ='item_id',drop = True).reset_index()。 set_index( '日期')。重新索引(IDX,方法= 'ffill'))'。這看起來合理嗎?第二:爲什麼日期不再像原始數據框那樣顯示爲標題中的索引?我不認爲這是一個問題,但你能解釋發生了什麼?數據幀是否仍然具有分層索引或...? – moustachio

+0

對你的第一部分的回答是肯定的,這是合理的,你可以放在reset_index沒有一個dup。對於第二種,我認爲由於您的彙總方式(因此它將刪除索引的名稱),索引有點困惑。你可以在應用程序中執行另一個reset_index,然後在最後(在應用程序''.reset_index(drop = True).set_index(['date','item_id'])''之後,重置mi – Jeff

+0

Hm ...這實際上並不起作用(我認爲日期索引適用於每個組,因此不能作爲實際數據框的索引訪問),但我認爲這在任何情況下都適用。 – moustachio