【问题标题】:Concat two dataframes with duplicated index that are in DateTime Format使用 DateTime 格式的重复索引连接两个数据帧
【发布时间】:2019-05-20 02:22:00
【问题描述】:

我正在尝试在两个包含重复索引的数据帧上使用 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

这与我原来的 Dataframe 也有相似的方面。索引是重复的,并且是日期时间格式。

但是 concat (with 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: Shape of passed values is blah, indices imply blah2 基本上是同一个问题,但是所有回答者都说问题是重复的索引,但这并不是唯一的原因,因为 concat 实际上确实适用于重复的索引。

我想真正了解问题所在以及解决问题的方法。

非常感谢

【问题讨论】:

    标签: python pandas dataframe concatenation concat


    【解决方案1】:

    ChuHo 回答了怎么做。我尝试回答为什么它不起作用:It should be this Bug

    问题似乎出现了,当两边都有重复的行和唯一的行时。

    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)
    

    【讨论】:

      【解决方案2】:

      您需要进行外部联接: df3.join(df2, how='outer')

                   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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        • 2020-07-18
        • 2017-09-04
        相关资源
        最近更新 更多