python - Pandas 重新索引具有重复键的数据框

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

最佳答案

我最近遇到了类似的问题。我通过首先从 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 中最接近的上次时间相匹配,这是第一行”。我不太理解这个说法。 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

关于python - Pandas 重新索引具有重复键的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868329/

相关文章:

Python YAML 参数引用(从其他参数获取值)

jquery - NoReverseMatch at/product/pussyes/Reverse 找不到 'basket_adding'。 'basket_adding' 不是有效的 View 函数或模式名称

python - 在 Numpy/Scipy 中切片数组

python - 如何修复指出字符串无法转换为 float 的值错误

python - Pandas 中的 Reindex 不接受轴参数?

python - 如何交换 pandas 数据框上的索引和值

python - 在 Python 中从文件中删除一行

Python Pandas Dataframe - 计算行之间的差异并取最小值

python - 重新采样 pandas 后,json 没有列名

ruby-on-rails - rake 太阳黑子:重新索引 rake 中止! RSolr::Error::Http - 404 未找到