Pandas Concat 给出“InvalidIndexError:重新索引仅对具有唯一值的索引对象有效”错误

新手上路,请多包涵

我有两个不同的 dfs,我想结合使用:

 pd.concat([df1, df2], 1)

最终结果是一个以日期为索引和所有列的 df。

根据 pandas 文档,这应该有效。它正在工作。但现在不是,我不知道为什么。

df1:

         gbp_open  gbp_high gbp_low gbp_close gbp_volume
date
2017-03-13  0.8217  0.82246 0.81627 0.8216  000
2017-03-10  0.8224  0.82366 0.82055 0.82255 000
2017-03-09  0.82139 0.82364 0.82    0.8212  000
2017-03-08  0.81943 0.82372 0.8186  0.81937 000
2017-03-07  0.817   0.82163 0.8163  0.8168  000
2017-03-06  0.81351 0.81659 0.8132  0.813   000
2017-03-03  0.8147  0.81854 0.8141  0.81468 000
2017-03-02  0.81492 0.81561 0.81264 0.81485 000
2017-03-01  0.80779 0.81402 0.80629 0.80788 000
2017-02-28  0.80403 0.8059  0.80183 0.8039  000

和 df2:

           inr_open  inr_high inr_low inr_close inr_volume
date
2017-03-13  66.485  66.58   66.11   66.485  000
2017-03-10  66.71   66.77   66.5398 66.6805 000
2017-03-09  66.815  66.853  66.60   66.765  000
2017-03-08  66.625  66.83   66.613  66.6162 000
2017-03-07  66.645  66.695  66.58   66.6647 000
2017-03-06  66.71   66.78   66.60   66.773  000
2017-03-03  66.845  66.885  66.74   66.8451 000
2017-03-02  66.69   66.858  66.67   66.858  000
2017-03-01  66.705  66.89   66.7046 66.7051 000
2017-02-28  66.735  66.808  66.59   66.6932 000

我尝试了几种不同的解决方案,但没有一个能满足我的需要,即在日期上将两者结合起来。

编辑:奇怪的是,我在不同的数据集上使用了几乎完全相同的代码(但操作相同)并且它没有任何问题。

编辑 2:也许这会有所帮助。我使用了 df1.join(df2, how = ‘outer’) 并且效果很好。好吧, 差不多 好了。当我检查任何重复值时,有一个日期显示四个(恰好是昨天 - 这可以解释为什么它是最近的问题)。

这对问题有何影响?

 xdf.index.value_counts()

2017-04-24    4
2016-11-14    1
2011-03-28    1
2011-09-19    1
2011-09-13    1
2013-12-25    1
2012-07-12    1
2011-08-08    1
2016-11-22    1

有什么想法吗?

原文由 Zach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
1 个回答

你的编辑基本上回答了这个问题:因为你的索引有多个相同的值,如果你想基于索引连接,那么如何对齐索引就存在歧义,所以 pandas 引发了错误:

所以这是可行的,因为索引是唯一的:

 df1 = pd.DataFrame(index=[0,1,2],columns=['A'],data=[19.,2.,-4.])
df2 = pd.DataFrame(index=[2,1,0],columns=['B'],data=[17.,28.,9.])
df3 = pd.concat(objs=[df1,df2],axis=1)

但是以下将引发与您相同的错误,因为不清楚第一个数据帧中值为“1”的两个索引中的哪一个应该与第二个数据帧中值为“1”的索引对齐:

 df3 = pd.DataFrame(index=[1,0,1],columns=['A'],data=[19.,2.,-4.])
df4 = pd.DataFrame(index=[0,1,1],columns=['B'],data=[17.,28.,9.])
df5 = pd.concat(objs=[df3,df4],axis=1)

尝试执行 df5 会给你 InvalidIndexError: Reindexing only valid with uniquely valued Index objects that you find。

原文由 EricGiambattista 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题