用稀疏的dataframe填充连续的pandas dataframe

17

我有一个名为date_dict的字典,以datetime日期为键,对应于观察到的整数计数。我将其转换为具有被屏蔽观测值的稀疏系列/数据框,并希望将其连接或转换为具有连续日期的系列/数据框。这个丑陋的列表理解是我的方法,以解决pandas显然无法自动将datetime日期对象转换为适当的DateTime索引。

df1 = pd.DataFrame(data=date_dict.values(),
                   index=[datetime.datetime.combine(i, datetime.time()) 
                          for i in date_dict.keys()],
                   columns=['Name'])
df1 = df1.sort(axis=0)

这个示例有1258个观测结果,其DateTime索引从2003-06-24到2012-11-07。

df1.head()
             Name
Date
2003-06-24   2
2003-08-13   1
2003-08-19   2
2003-08-22   1
2003-08-24   5

我可以创建一个带有连续 DateTime 索引的空数据框,但这会引入一个不必要的列并且看起来很笨重。我觉得我可能错过了一种更优雅的解决方案,涉及到连接(join)。

df2 = pd.DataFrame(data=None,columns=['Empty'],
                   index=pd.DateRange(min(date_dict.keys()),
                                      max(date_dict.keys())))
df3 = df1.join(df2,how='right')
df3.head()
            Name    Empty
2003-06-24   2   NaN
2003-06-25  NaN  NaN
2003-06-26  NaN  NaN
2003-06-27  NaN  NaN
2003-06-30  NaN  NaN

有没有一种更简单、更优雅的方法从一个稀疏的数据框中填充连续的数据框,以便有(1) 连续的索引, (2) NaN变成0,且没有剩余为空的列在数据框中?

            Name
2003-06-24   2
2003-06-25   0
2003-06-26   0
2003-06-27   0
2003-06-30   0
1个回答

23

您可以在时间序列上使用reindex,使用您的日期范围。同时,看起来您最好使用TimeSeries而不是DataFrame(请参见文档),虽然重新索引也是向DataFrames添加缺失索引值的正确方法。

例如,从以下内容开始:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13),
        pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)])

ts = pd.Series([2,1,2,1,5], index=date_index)

给你一个类似于你的示例数据框头部的时间序列:

2003-06-24    2
2003-08-13    1
2003-08-19    2
2003-08-22    1
2003-08-24    5

只需要简单地执行

ts.reindex(pd.date_range(min(date_index), max(date_index)))

然后为您提供完整的索引,对于缺失值,返回NaN(如果您想使用其他值填充缺失值,可以使用fillna - 参见这里):

2003-06-24     2
2003-06-25   NaN
2003-06-26   NaN
2003-06-27   NaN
2003-06-28   NaN
2003-06-29   NaN
2003-06-30   NaN
2003-07-01   NaN
2003-07-02   NaN
2003-07-03   NaN
2003-07-04   NaN
2003-07-05   NaN
2003-07-06   NaN
2003-07-07   NaN
2003-07-08   NaN
2003-07-09   NaN
2003-07-10   NaN
2003-07-11   NaN
2003-07-12   NaN
2003-07-13   NaN
2003-07-14   NaN
2003-07-15   NaN
2003-07-16   NaN
2003-07-17   NaN
2003-07-18   NaN
2003-07-19   NaN
2003-07-20   NaN
2003-07-21   NaN
2003-07-22   NaN
2003-07-23   NaN
2003-07-24   NaN
2003-07-25   NaN
2003-07-26   NaN
2003-07-27   NaN
2003-07-28   NaN
2003-07-29   NaN
2003-07-30   NaN
2003-07-31   NaN
2003-08-01   NaN
2003-08-02   NaN
2003-08-03   NaN
2003-08-04   NaN
2003-08-05   NaN
2003-08-06   NaN
2003-08-07   NaN
2003-08-08   NaN
2003-08-09   NaN
2003-08-10   NaN
2003-08-11   NaN
2003-08-12   NaN
2003-08-13     1
2003-08-14   NaN
2003-08-15   NaN
2003-08-16   NaN
2003-08-17   NaN
2003-08-18   NaN
2003-08-19     2
2003-08-20   NaN
2003-08-21   NaN
2003-08-22     1
2003-08-23   NaN
2003-08-24     5
Freq: D, Length: 62

2
谢谢!我使用了ts.reindex(pd.date_range(min(date_index), max(date_index)),fill_value=0)。 - Brian Keegan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接