Python 熊猫用重复的键重新索引数据帧

Python 熊猫用重复的键重新索引数据帧,python,pandas,reindex,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 = dateti

以下是问题的一个示例:

>>> 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中最近的最后一次时间匹配,这是第一行。我想出了一种人为的方法来解决这个问题,就是在第二个时间序列中添加一个虚假的微秒值,这样它就变得独一无二了。但这对于大数据帧来说是缓慢的。这是不允许的原因吗?这似乎是一件合乎逻辑的事情。有没有更好的方法来克服这个限制?

我最近遇到了类似的问题。我首先从
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列的值2

我注意到您说“我希望将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

也许你应该给你的原始问题举个例子(用时间序列索引)。也许还有另一种方法可以解决你的问题。我已经修改了我的例子,使之更接近我原来的问题。我仍然不太理解这个问题
pd.concat((df,df2))
如果您只想连接df,就可以工作。我想在df上执行pd.merge,在索引上执行df2,但由于索引不完全相等,因此合并不起作用。我最终想做的是将df2与df中最接近的索引合并。这不是问题吗?如果是,请相应地更新您的标题。感谢您的回答,我最终通过删除df2中的重复项实现了相同的绕过。实际上,您可以通过执行df2.groupby(df2.index).first()删除重复的索引。至于这个令人费解的声明,这确实是一个错误,我没有注意到这一分钟是不同的。关于groupby的好提示。谢谢