使用重复键重新索引DataFrame
这里有一个问题的例子:
>>> 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 个回答
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' 来让某一列的值变成 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