pandas使用重复键重新索引数据帧

时间:2013-02-14 05:26:44

标签: python pandas reindex

以下是问题的一个示例:

>>> 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合并。由于索引时间不匹配,我希望将df2时间与df中最接近的最后一次匹配,这是第一行。我提出解决这个问题的一种人为方法是在第二个时间序列中添加一个假的微秒值,使其变得独一无二。但对于大型数据帧来说这很慢。是否有特殊原因导致不允许这样做?这似乎是合乎逻辑的事情。有没有更好的方法来克服这个限制?

1 个答案:

答案 0 :(得分:3)

我最近遇到了类似的问题。我首先从df2删除重复项解决了这个问题。这样做可以让你考虑要保留哪一个以及丢弃哪一个。不幸的是,pandas似乎没有很好的方法来删除基于重复索引条目的重复项,但是这种解决方法(向df2添加'index'列)应该这样做:

>>> 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列的值。

我注意到你说“我希望将df2时间与df中最接近的时间匹配,这是第一行”。我不太明白这个说法。 df中与df2中的时间最接近的时间是第二行,而不是第一行。如果我误解了你的问题,请告诉我,我会更新这个答案。

供参考,这是我的测试数据:

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