用日期时间格式

时间:2018-12-19 14:57:19

标签: python pandas dataframe concatenation concat

我正在尝试在包含重复索引的两个数据帧上使用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(轴= 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确实适用于重复的索引。

我想真正地了解出了什么问题以及解决该问题的方法。

非常感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)