3

同様の日時インデックスのデータを含む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)

私が理解している限り、それは増加しているはずです。「単調」についてはわかりませんが、上記の例で示されているように、制約ではないと想定しました(まだ日付がありませんでした)。

正しい用語を使用していない場合はご容赦ください。

PSデータフレームのリストを繰り返し処理すると、再インデックスを適用した後、実際にはdf1、df2、df3に保​​存されていないように見えます。どうすれば修正できますか?

4

1 に答える 1

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

編集:

ここにあなたのエラーを再現したスニペットがありましたが、それはそれ自体の質問としてよりうまく機能すると思いますので 、こちらをご覧ください

于 2016-06-23T03:23:50.237 に答える