大熊猫重新编制索引,缺少日期

时间:2016-03-24 15:40:59

标签: python pandas indexing nan reindex

from dateutil.rrule import rrule, MONTHLY

def fread_year_month(strt_dt, end_dt):
        dates = [dt for dt in rrule(MONTHLY, dtstart=strt_dt, until=end_dt)]
        return dates

df = pd.DataFrame({
'value' : [4,2,5,6,7,8,6,5,4,1,2,4],
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 12, 1)),
'stock': ['amzn']*12
},columns=[
'value', 'date', 'stock'] )

df2 = pd.DataFrame({
'value' : [1,1,1,1,1],
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 5, 1)),
'stock': ['msft']*5
},columns=[
'value', 'date', 'stock'] )

df = df.append(df2)

df.set_index(['stock', 'date'], inplace=True)

我有上面的pandas数据帧。正如您所看到的,amzn的可用数据数量与msft不同。在此示例中,日期是顺序的,但不一定是这种情况(日期可以是任何日期)。

如果可用日期的范围是我有AMZN数据的日期,那么如何使用NaN或NA为我的数据框中的每个其他股票添加这些确切日期。

在示例中,我想在索引中插入msft的缺失日期,并为这些日期索引插入NaN或NA。

2 个答案:

答案 0 :(得分:1)

如果您想将自己的代码作为列,可以执行unstack,如下所示:

In [71]: df.unstack(level=0)
Out[71]: 
           value     
stock       amzn msft
date                 
2015-01-01   4.0  1.0
2015-02-01   2.0  1.0
2015-03-01   5.0  1.0
2015-04-01   6.0  1.0
2015-05-01   7.0  1.0
2015-06-01   8.0  NaN
2015-07-01   6.0  NaN
2015-08-01   5.0  NaN
2015-09-01   4.0  NaN
2015-10-01   1.0  NaN
2015-11-01   2.0  NaN
2015-12-01   4.0  NaN

要重新索引到相同的形状,下面的from_product会创建一个新的MultiIndex,其中包含所有日期/代码组合。

In [75]: df.reindex(pd.MultiIndex.from_product(df.index.levels))
Out[75]: 
                 value
amzn 2015-01-01    4.0
     2015-02-01    2.0
     2015-03-01    5.0
     2015-04-01    6.0
     2015-05-01    7.0
     2015-06-01    8.0
     2015-07-01    6.0
     2015-08-01    5.0
     2015-09-01    4.0
     2015-10-01    1.0
     2015-11-01    2.0
     2015-12-01    4.0
msft 2015-01-01    1.0
     2015-02-01    1.0
     2015-03-01    1.0
     2015-04-01    1.0
     2015-05-01    1.0
     2015-06-01    NaN
     2015-07-01    NaN
     2015-08-01    NaN
     2015-09-01    NaN
     2015-10-01    NaN
     2015-11-01    NaN
     2015-12-01    NaN

答案 1 :(得分:1)

合并之前,你可以这样做(截至Pandas 0.17):

>>> df2.set_index('date').reindex(df.date)
            value stock
date                   
2015-01-01      1  msft
2015-02-01      1  msft
2015-03-01      1  msft
2015-04-01      1  msft
2015-05-01      1  msft
2015-06-01    NaN   NaN
2015-07-01    NaN   NaN
2015-08-01    NaN   NaN
2015-09-01    NaN   NaN
2015-10-01    NaN   NaN
2015-11-01    NaN   NaN
2015-12-01    NaN   NaN