当前位置: 首页 > 知识库问答 >
问题:

使用DateTime格式的重复索引连接两个数据帧

易星纬
2023-03-14

我试图在包含重复索引的两个数据帧上使用pandas concat。

当我尝试连接我的两个数据帧时,我得到以下错误

传递值的形状是(12, 180054),指数暗示(12,10000)。

为了更好地理解这个问题,我创建了两个数据帧:

df1 = pd.DataFrame([{'a':"2018-01-01",'b':2},{'a':"2018-01-01",'b':3},{'a':"2018-01-02",'b':4}],
                   columns = ['a','b']).set_index('a')
df1.index = pd.to_datetime(df1.index)

看起来像:

            b
a   
2018-01-01  2
2018-01-01  3
2018-01-02  4

df2 = pd.DataFrame([{'a':"2018-01-01",'c':5},{'a':"2018-01-02",'c':6}],columns = ['a','c']).set_index('a')
df2.index = pd.to_datetime(df2.index)

看起来像:

            c
a   
2018-01-01  5
2018-01-02  6

这与我的原始数据帧也有类似的方面。索引是重复的,并且是日期时间格式。

但是,concat(axis=1)可以很好地创建以下数据帧

            b   c
a       
2018-01-01  2   5
2018-01-01  3   5
2018-01-02  4   6

(这正是我所期望的)

但是,如果我使用:

df3 = pd.DataFrame([{'a':"2018-01-01",'b':2},{'a':"2018-01-01",'b':3},{'a':"2018-01-03",'b':4}],
                   columns = ['a','b']).set_index('a')
df3.index = pd.to_datetime(df3.index)

看起来像:

            b
a   
2018-01-01  2
2018-01-01  3
2018-01-03  4

它返回的不是df1

Shape of passed values is (2, 6), indices imply (2, 4)

两者之间唯一的区别是df1的最终日期是2018-01-02,df3的最终日期是2018-01-03。

逻辑上(至少对我来说)它应该返回以下内容:

            b   c
a       
2018-01-01  2   5
2018-01-01  3   5
2018-01-02  Nan 6
2018-01-03  4   Nan

我不明白它如何能够正确地做一个,而不是另一个,因为如果它不能处理重复的索引,它应该在两个上同样失败。

Pandas concat:ValueError:传递的值的形状是blah,索引意味着blah2基本上是同一个问题,但是所有的anaswers都说问题在于重复索引,但是这不是唯一的原因,因为concat确实使用重复的索引。

我想真正了解出了什么问题,以及回避这个问题的方法

非常感谢

共有2个答案

顾兴昌
2023-03-14

ChuHo回答了如何做到这一点。我试图回答为什么它不起作用:它应该是这个错误。

当两边都有重复的行和唯一的行时,问题似乎会发生。

import pandas as pd

frame_a = pd.DataFrame({'a': ['a1']}, index = [1])
frame_b = pd.DataFrame({'b': ['b1', 'b2', 'b2']}, index = [1,2,2])
frame_c = pd.DataFrame({'c': ['c3', 'c3']}, index = [3,3])

pd.concat([frame_a,frame_b], axis=1)  # works
     a   b
1   a1  b1
2  NaN  b2
2  NaN  b2
pd.concat([frame_a,frame_c], axis=1)  # fails
ValueError: Shape of passed values is (5, 2), indices imply (3, 2)
葛深
2023-03-14

你需要做一个外部连接:df3.join(df2, how='外')

             b    c
a                   
2018-01-01  2.0  5.0
2018-01-01  3.0  5.0
2018-01-02  NaN  6.0
2018-01-03  4.0  NaN
 类似资料:
  • 我有两个火花DF,我需要加入。只选择df1中存在的df2中的值,不应该有重复的行。 例如: df1: df2: 我正在做以下工作: 但是我的输出有几个重复的行。 如果val从df1中删除,我试图实现一个类似except的操作。但是除了之外,

  • 我尝试在做了一些转换和过滤后将很多CSV文件加入到一个数据帧中,当我对sn2数据帧使用append方法时,导出的CSV包含我想要的所有数据,但是当我对sn3数据帧使用append方法时,只有最后一个CSV的数据被导出,我错过了什么?

  • 假设我有两个数据帧,具有不同级别的信息,如下所示: 我想加入df1和df2,并将“值”信息传递给df2:一天中的每一小时都将获得“日”值。 预期产出:

  • 我得到以下错误 关于代码 我试图将的列连接到的列。 对于这些打印语句 我得到以下输出: 你知道是什么问题吗?为什么索引会成为一个问题?索引应该是相同的,因为我关注的是列,而不是行。列值似乎完全不同。 谢谢

  • 如何使用panda连接2个CSV文件,使生成的CSV文件没有行索引?见下例: 文件1。csv 文件2。csv desired_file.csv 不是这个: 我的代码: 谢谢:)

  • 问题内容: 我正在使用两个MySQL数据库。我想将DB1中的表与SQLAlchemy中DB2中的表连接起来。 我在sqlalchemy中创建数据访问层时正在使用automap_base,如下所示… 我的表类就像 我正在这样加入 我收到这样的错误: 我们在数据库db1中创建了表t1,在数据库db2中创建了表t2。 是否可以在sqlalchemy ORM中的两个数据库表之间进行联接?如何实现呢? 问题