在pandas中重新索引和填充层级索引的一个级别

mou*_*hio 6 python pandas

我有一个带有两级分层索引('item_id'和'date')的pandas数据帧.每行都有列,用于特定月份中特定项目的各种指标.这是一个示例:

                    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
Run Code Online (Sandbox Code Playgroud)

如您所见,每个项目的所有连续月份都没有观察结果.我想要做的是重新索引数据框,使每个项目在指定范围内每个月都有行.现在,对于任何给定的项目,这很容易实现.因此,对于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')
Run Code Online (Sandbox Code Playgroud)

但是使用这种方法,我必须遍历所有item_ids,然后将所有内容合并在一起,这看起来非常复杂.

那么如何将其应用于完整的数据框,填充观察结果(以及item_id索引),以便每个item_id都正确填充了baseDateRange中所有日期的行?

Jef*_*eff 6

基本上每个组都要重新索引和填充.apply会传递一个数据框,其中item_id和date仍然在索引中,因此重置,然后设置并使用填充重新索引.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
Run Code Online (Sandbox Code Playgroud)