我有4个数据帧,其中包含类似日期时间索引的数据,但是在每个数据帧中都有很少的缺失行,我知道可以使用以前的已知数据填充这些空白。
我想'对齐'这些数据框,以便它们具有所有数据框的索引并且可以填充缺失的值。
我知道如何为2个数据帧执行此操作:df1, df2 = df1.align(df2, axis=0, method='pad')
,但是超过2个数据帧的好方法是什么?
我试过这个并且确实有效:
df1 = pd.DataFrame({'values': 1}, index=pd.DatetimeIndex(['2016-06-01', '2016-06-03']))
df2 = pd.DataFrame({'values': 2}, index=pd.DatetimeIndex(['2016-06-02', '2016-06-04', '2016-06-07']))
df3 = pd.DataFrame({'values': 3}, index=pd.DatetimeIndex(['2016-06-01', '2016-06-05']))
commonIndex = df1.index.join(df2.index, how='outer').join(df3.index, how='outer')
for d in [df1, df2, df3]:
d = d.reindex(index=commonIndex, method='pad')
然而,当我对我的真实数据尝试相同的方法时,它会给出错误:“ValueError:index必须是单调增加或减少”。它是价格数据,索引如下所示:
DatetimeIndex(['2014-03-24 00:00:00', '2014-03-24 00:01:00',
'2014-03-24 00:02:00', '2014-03-24 00:03:00',
'2014-03-24 00:04:00', '2014-03-24 00:05:00',
'2014-03-24 00:06:00', '2014-03-24 00:07:00',
'2014-03-24 00:08:00', '2014-03-24 00:09:00',
...
'2014-10-10 17:51:00', '2014-10-10 17:52:00',
'2014-10-10 17:53:00', '2014-10-10 17:54:00',
'2014-10-10 17:55:00', '2014-10-10 17:56:00',
'2014-10-10 17:57:00', '2014-10-10 17:58:00',
'2014-10-10 17:59:00', '2014-10-10 18:00:00'],
dtype='datetime64[ns]', name=u'datetime', length=139671, freq=None)
据我所知,它应该增加。不确定'单调',但我认为这不是一个约束,如上例所示(仍然缺少日期)。
非常感谢任何帮助,如果我没有使用正确的术语,请原谅我。
P.S。当我遍历数据帧列表时,看起来它们在应用重建索引后实际上并未保存在df1,df2,df3中。我该如何解决这个问题?
答案 0 :(得分:3)
这是您尝试实现的行为吗?请注意,无论数据帧上的索引是否是单调的,此方法都可以正常工作。
df1 = pd.DataFrame({'values': 1}, index=pd.DatetimeIndex(['2016-06-01', '2016-06-03']))
df2 = pd.DataFrame({'values': 2}, index=pd.DatetimeIndex(['2016-06-02', '2016-06-04', '2016-06-07']))
df3 = pd.DataFrame({'values': 3}, index=pd.DatetimeIndex(['2016-06-01', '2016-06-05']))
df = pd.concat([df1,df2,df3], axis=1).ffill().bfill()
df.columns = ['values1', 'values2', 'values3']
df
给出了:
values1 values2 values3
2016-05-04 1.0 2.0 3.0
2016-06-01 1.0 2.0 3.0
2016-06-02 1.0 2.0 3.0
2016-06-03 1.0 2.0 3.0
2016-06-05 1.0 2.0 3.0
或者,如果您只想将数据帧分开,无论数据帧是否具有单调索引,这都将起作用。
commonIndex = df1.index | df2.index | df3.index
df2.reindex(commonIndex).ffill()
编辑:
我在这里有一个代码片段可以重现您的错误,但我认为它更适合自己的问题 - 所以take a look here。