Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对齐多个数据帧的索引,并在Pandas中填充各自缺失的值?_Python_Pandas_Dataframe_Reindex_Datetimeindex - Fatal编程技术网

Python 如何对齐多个数据帧的索引,并在Pandas中填充各自缺失的值?

Python 如何对齐多个数据帧的索引,并在Pandas中填充各自缺失的值?,python,pandas,dataframe,reindex,datetimeindex,Python,Pandas,Dataframe,Reindex,Datetimeindex,我有4个数据帧,其中的数据具有相似的日期时间索引,但是在每个数据帧中几乎没有缺失的行,我知道可以使用以前的已知数据来填补空白 我想“对齐”这些数据帧,以便它们具有所有数据帧索引的并集,并填充缺少的值。 我知道如何对2个数据帧执行此操作:df1,df2=df1.align(df2,axis=0,method='pad'),但对2个以上的数据帧执行此操作的好方法是什么 我已经试过了,它确实有效: df1 = pd.DataFrame({'values': 1}, index=pd.DatetimeI

我有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()

编辑:


我这里有一个片段再现了您的错误,但我认为它作为自己的问题效果更好-那么。

在for循环中重新分配变量是否会像这样起作用?@michael_j_ward我很确定我的真实数据也在增加。有没有一种方法可以检查它,或者甚至显示它不是这样的?谢谢。另外,您的代码给出了一个错误
ValueError:index必须是单调递增或递减的
@AndyHayden,第二个代码段应该会产生该错误。关键是我能够重现OPs错误。此外,仅当调用
method='pad'
参数时,才会再现。我希望进一步隔离这个问题,以便其他人能够提供帮助insight@danilam然后把填充方法放在外面。我马上更新你可以更好地编写
commonIndex=df1.index | df2.index | df3.index