连接两个具有 DateTime 格式的重复索引的数据帧
Concat two dataframes with duplicated index that are in DateTime Format
我正在尝试对包含重复索引的两个数据框使用 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(轴 = 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,它 returns
Shape of passed values is (2, 6), indices imply (2, 4)
两者唯一的区别是df1的截止日期是2018-01-02,df3的截止日期是2018-01-03。
逻辑上(至少对我而言)应该return如下:
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 实际上确实使用重复的索引。
我想真正了解问题所在以及解决问题的方法。
非常感谢
您需要进行外部联接:
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
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)
我正在尝试对包含重复索引的两个数据框使用 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(轴 = 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,它 returns
Shape of passed values is (2, 6), indices imply (2, 4)
两者唯一的区别是df1的截止日期是2018-01-02,df3的截止日期是2018-01-03。
逻辑上(至少对我而言)应该return如下:
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 实际上确实使用重复的索引。
我想真正了解问题所在以及解决问题的方法。
非常感谢
您需要进行外部联接:
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
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)