python-如何对齐多个数据框的索引并填写熊猫中各自的缺失值?

我有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:索引必须单调递增或递减”.它是价格数据,索引如下所示:

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)

据我了解,它应该会增加.不确定“单调”,但我认为这不是如上例所示的约束(仍然缺少日期).

非常感谢您的帮助,如果我使用的术语不正确,请原谅我.

附言当我遍历数据帧列表时,看起来在应用重新索引编制之后,它们实际上并没有真正保存在df1,df2,df3中.我该如何解决?

解决方法:

这是您要尝试实现的行为吗?请注意,无论数据帧上的索引是否单调,此方法都有效.

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.

上一篇:ES重建索引(reindex)性能优化建议


下一篇:python数据分析学习(3)pandas基本功能一