3

問題の例を次に示します。

>>> df = DataFrame({'a':[1,2]},index=[datetime.today(),datetime.today()+timedelta(days=1)])
>>> df
                            a
2013-02-15 09:36:14.665272  1
2013-02-16 09:36:14.857322  2
>>> dup_index = datetime.today()
>>> df2 = DataFrame({'a':[2,3]},index=[dup_index,dup_index])
>>> df2
                            a
2013-02-15 09:37:11.701271  2
2013-02-15 09:37:11.701271  3
>>>
>>> df2.reindex(df.index,method='ffill')
Traceback (most recent call last):
...
Exception: Reindexing only valid with uniquely valued Index objects

df2 を df とマージしたい。インデックス時間が一致しないため、最初の行である df で最も近い最後の時間と df2 時間を一致させたいと考えています。これを解決するために私が思いついた人為的な方法の 1 つは、2 番目の時系列に偽のマイクロ秒値を追加して、それが一意になるようにすることでした。しかし、これは大きなデータフレームでは遅くなります。これが許可されない特定の理由はありますか? それは論理的なことのように思えます。この制限を克服するためのより良い方法はありますか?

4

1 に答える 1

3

最近、同様の問題に遭遇しました。最初に から重複を削除することで解決しましたdf2。そうすることで、どれを残してどれを捨てるかを考えさせられます。残念ながら、pandas には、重複したインデックス エントリに基づいて重複を削除する優れた方法がないようですが、この回避策 (「インデックス」列を に追加するdf2) で行う必要があります。

>>> df2['index'] = df2.index
>>> df3 = df2.drop_duplicates(cols='index', take_last=True).reindex(df.index, method='ffill')
>>> del df3['index']
>>> df3
                             a
2013-02-21 09:51:56.615338 NaN
2013-02-22 09:51:56.615357   3

もちろん、'take_last=False' を設定して、a 列の値を 2 にすることもできます。

「df2 の時刻を、最初の行である df で最も近い前回の時刻と一致させたい」とおっしゃっていたことに気付きました。この発言がよく分からなかった。df2 の時刻に最も近い df の時刻は、最初の行ではなく 2 番目の行です。あなたの質問を誤解した場合はお知らせください。この回答を更新します。

参考までに、私のテストデータは次のとおりです。

>>> df
                            a
2013-02-21 09:51:56.615338  1
2013-02-22 09:51:56.615357  2
>>> df2
                            a
2013-02-21 09:51:57.802331  2
2013-02-21 09:51:57.802331  3
于 2013-02-21T15:06:21.130 に答える