Python Pandas:多索引中的填充日期范围

时间:2014-12-02 18:43:59

标签: python pandas

假设我正在尝试为会员企业组织销售数据。

我只有开始和结束日期。理想情况下,开始日期和结束日期之间的销售额显示为1,而不是丢失。

我无法让“日期”列填充中间日期。那就是:我想连续几个月而不是差距。另外,我需要使用ffill填充列中的缺失数据。

我尝试过不同的方法,例如stack / unstack和reindex,但会出现不同的错误。我猜这是一个干净的方法来做到这一点。这样做的最佳做法是什么?

假设多索引数据结构:

                 variable     sales
vendor date                 
a      2014-01-01  start date 1
       2014-03-01    end date 1
b      2014-03-01  start date 1
       2014-07-01    end date 1

和期望的结果

                   variable   sales
vendor date                 
a      2014-01-01  start date 1
       2014-02-01  NaN        1
       2014-03-01    end date 1
b      2014-03-01  start date 1
       2014-04-01  NaN        1
       2014-05-01  NaN        1
       2014-06-01  NaN        1 
       2014-07-01    end date 1

2 个答案:

答案 0 :(得分:5)

你可以这样做:

>>> f = lambda df: df.resample(rule='M', how='first')
>>> df.reset_index(level=0).groupby('vendor').apply(f).drop('vendor', axis=1)
                     variable  sales
vendor date                         
a      2014-01-31  start date      1
       2014-02-28         NaN    NaN
       2014-03-31    end date      1
b      2014-03-31  start date      1
       2014-04-30         NaN    NaN
       2014-05-31         NaN    NaN
       2014-06-30         NaN    NaN
       2014-07-31    end date      1

,如果需要,只需sales列上的.fillna

答案 1 :(得分:0)

我有一个解决方案,但这并不是很简单:

所以,这是你的DataFrame

>>> df
                   sales date variable
vendor date                           
a      2014-01-01      1    start date
       2014-01-03      1      end date
b      2014-01-03      1    start date
       2014-01-07      1      end date

首先,我想为新的MultiIndex

创建数据
>>> df2 = df.set_index('date variable', append=True).reset_index(level='date')['date']
>>> df2
vendor  date variable
a         start date    2014-01-01
          end date      2014-01-03
b         start date    2014-01-03
          end date      2014-01-07
>>> df2 = df2.unstack()
>>> df2
date variable   end date   start date
vendor                               
a             2014-01-03   2014-01-01
b             2014-01-07   2014-01-03

现在,为新MultiIndex创建元组:

>>> tuples = [(x[0], d) for x in df3.iterrows() for d in pd.date_range(x[1]['start date'], x[1]['end date'])]
>>> tuples
[('a', '2014-01-01'), ..., ('b', '2014-01-07)]

并创建MultiIndexreindex()

>>> mi = pd.MultiIndex.from_tuples(tuples,names=df.index.names)
>>> df.reindex(mi)
                   sales date variable
vendor date                           
a      2014-01-01      1    start date
       2014-01-02    NaN           NaN
       2014-01-03      1      end date
b      2014-01-03      1    start date
       2014-01-04    NaN           NaN
       2014-01-05    NaN           NaN
       2014-01-06    NaN           NaN
       2014-01-07      1      end date