【问题标题】:Pandas: Inconsistent concatenation熊猫:不一致的连接
【发布时间】:2018-11-02 19:15:08
【问题描述】:

我有两个带有日期时间戳的 pandas DataFrames 作为索引,称为“datetime”,一些浮点数作为称为“metric1”或“metric2”的列。当我尝试连接它们时,出现以下错误:

ValueError: cannot reindex from a duplicate axis

阅读了几个小时后,我找不到解决我问题的解决方案(例如 What does `ValueError: cannot reindex from a duplicate axis` mean? "ValueError: cannot reindex from a duplicate axis" )。

然后我花了很长时间试图重现问题,但没有我的具体数据就无法解决,但我的数据有两个很大,可以在这里发布。

最后,数据框的某些部分似乎不兼容,但其他部分很好。在比较了许多不同的索引切片后,我终于发现了不兼容的集合。有人可以帮我理解为什么我不能连接这些。

基本上我希望所有可能的时间戳都在索引中,并且有一列用于“metric1”和“metric2”。如果给定时间戳的列没有数据,那么我们只有 NaN 或其他东西。这在pd.concat 下正常工作,但在这种情况下不起作用。要重新创建,请使用:

CSV 文件:

test1.csv

timestamp,metric1
2018-03-21 15:46:36,3.5555559999999997
2018-03-21 15:47:36,5.345001
2018-03-21 15:48:36,5.719998

test2.csv

timestamp,metric2
2018-03-28 05:49:59,3.28
2018-03-28 05:50:59,3.45
2018-03-28 05:51:59,3.258332
2018-03-28 05:52:59,3.068333
2018-03-28 05:53:59,2.9733330000000002
2018-03-28 05:54:59,3.0650009999999996
2018-03-28 05:55:59,3.109999
2018-03-28 05:56:59,3.3683330000000002
2018-03-28 05:57:59,3.1516669999999998
2018-03-28 05:58:59,3.051666
2018-03-28 05:59:59,3.3083339999999994
2018-03-28 06:01:01,3.328333
2018-03-28 06:01:01,3.1
2018-03-28 06:02:00,3.305
2018-03-28 06:03:00,3.29
2018-03-28 06:04:00,3.2183330000000003
2018-03-28 06:05:00,3.176666
2018-03-28 06:06:00,3.353333
2018-03-28 06:07:00,3.3233330000000003
2018-03-28 06:08:00,3.393332
2018-03-28 06:09:00,3.053334
2018-03-28 06:10:00,3.268333
2018-03-28 06:11:00,3.239999
2018-03-28 06:12:00,3.223332
2018-03-28 06:13:00,3.119999

test4.csv

timestamp,metric2
2018-03-21 00:00:00,10.665
2018-03-21 00:01:00,10.285
2018-03-21 00:02:00,10.12834

注意:test2.csv 和 test4.csv 来自完全相同的数据集。

现在让我们加载 CSV 文件:

tt1 = pd.read_csv('test1.csv', index_col=0)
tt1.index = pd.to_datetime(tt1.index)
tt2 = pd.read_csv('test2.csv', index_col=0)
tt2.index = pd.to_datetime(tt2.index)
tt4 = pd.read_csv('test4.csv', index_col=0)
tt4.index = pd.to_datetime(tt4.index)

现在让我们测试连接它们:

测试没有错误

tt3 = pd.concat([tt1, tt4], axis = 1)

测试错误

tt3 = pd.concat([tt1, tt2], axis = 1)
ValueError: cannot reindex from a duplicate axis

【问题讨论】:

  • Concat 不是正确的工具。对于这个问题,你应该使用合并。
  • @tobsecret 感谢您的评论,但您能扩展一下吗?为什么现在合并是合适的,是否有任何“经验法则”来帮助决定这种事情?
  • 根本问题是tt1tt2 有同名的索引。
  • @ojunk 请参阅stackoverflow.com/a/49564930/7480990 简而言之,pd.concat 在这种情况下的问题是重复的列也会在 DataFrame 中重复出现。合并缓解了这一问题,因为正如 Harv Ipan 的回答所示,它也适用于列,允许您通过重置每个数据帧的索引来处理重复索引。

标签: python pandas


【解决方案1】:

不要mergejoinjoin 加入索引。

tt1.join(tt2, how='outer')

【讨论】:

  • 你需要how='outer'
【解决方案2】:

我已经解决了你的问题。

看看这个解决方案:)

import pandas as pd

tt1 = pd.read_csv('test1.csv', index_col=0)
tt1.index = pd.to_datetime(tt1.index)
tt2 = pd.read_csv('test2.csv', index_col=0)
tt2.index = pd.to_datetime(tt2.index)
tt4 = pd.read_csv('test4.csv', index_col=0)
tt4.index = pd.to_datetime(tt4.index)

tt3 = pd.concat([tt1, tt4], axis=1)
tt4 = tt3.reset_index().merge(tt2.reset_index(), how='outer')
tt4 = tt4.set_index('timestamp')
print(tt4)

希望它有意义

【讨论】:

  • 有什么区别?
  • 您回答我的朋友时没有任何区别。我只是完成代码并重新索引时间戳列。希望它会清除事情
【解决方案3】:

tt2 中有重复索引。这会导致错误。 获取输出的正确方法:

tt1.reset_index().merge(tt2.reset_index(), how='outer')

【讨论】:

  • 谢谢@Harv Ipan 这对重复索引有什么作用?
  • @ojunk,您确定您的数据框正是您正在处理的最小示例吗?如果你不reset_index(),你应该得到这个错误。该代码对我有用。另请参阅this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2016-05-10
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多