Pandas concat: ValueError: Shape of passed values is blah, indices imply blah2
我正在尝试合并一个(pandas 14.1)数据帧和一个系列。序列应该形成一个新的列,其中包含一些NAS(因为序列的索引值是数据帧索引值的子集)。
这适用于一个玩具示例,但不适用于我的数据(详情如下)。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import pandas as pd import numpy as np df1 = pd.DataFrame(np.random.randn(6, 4), columns=['A', 'B', 'C', 'D'], index=pd.date_range('1/1/2011', periods=6, freq='D')) df1 A B C D 2011-01-01 -0.487926 0.439190 0.194810 0.333896 2011-01-02 1.708024 0.237587 -0.958100 1.418285 2011-01-03 -1.228805 1.266068 -1.755050 -1.476395 2011-01-04 -0.554705 1.342504 0.245934 0.955521 2011-01-05 -0.351260 -0.798270 0.820535 -0.597322 2011-01-06 0.132924 0.501027 -1.139487 1.107873 s1 = pd.Series(np.random.randn(3), name='foo', index=pd.date_range('1/1/2011', periods=3, freq='2D')) s1 2011-01-01 -1.660578 2011-01-03 -0.209688 2011-01-05 0.546146 Freq: 2D, Name: foo, dtype: float64 pd.concat([df1, s1],axis=1) A B C D foo 2011-01-01 -0.487926 0.439190 0.194810 0.333896 -1.660578 2011-01-02 1.708024 0.237587 -0.958100 1.418285 NaN 2011-01-03 -1.228805 1.266068 -1.755050 -1.476395 -0.209688 2011-01-04 -0.554705 1.342504 0.245934 0.955521 NaN 2011-01-05 -0.351260 -0.798270 0.820535 -0.597322 0.546146 2011-01-06 0.132924 0.501027 -1.139487 1.107873 NaN |
数据的情况(见下文)基本上是相同的——用一个日期时间索引来表示一个系列,它的值是数据帧的一个子集。但是它在标题中给出了值错误(blah1=(5286)blah2=(5276))。为什么不起作用?:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | In[187]: df.head() Out[188]: high low loc_h loc_l time 2014-01-01 17:00:00 1.376235 1.375945 1.376235 1.375945 2014-01-01 17:01:00 1.376005 1.375775 NaN NaN 2014-01-01 17:02:00 1.375795 1.375445 NaN 1.375445 2014-01-01 17:03:00 1.375625 1.375515 NaN NaN 2014-01-01 17:04:00 1.375585 1.375585 NaN NaN In [186]: df.index Out[186]: <class 'pandas.tseries.index.DatetimeIndex'> [2014-01-01 17:00:00, ..., 2014-01-01 21:30:00] Length: 271, Freq: None, Timezone: None In [189]: hl.head() Out[189]: 2014-01-01 17:00:00 1.376090 2014-01-01 17:02:00 1.375445 2014-01-01 17:05:00 1.376195 2014-01-01 17:10:00 1.375385 2014-01-01 17:12:00 1.376115 dtype: float64 In [187]:hl.index Out[187]: <class 'pandas.tseries.index.DatetimeIndex'> [2014-01-01 17:00:00, ..., 2014-01-01 21:30:00] Length: 89, Freq: None, Timezone: None In: pd.concat([df, hl], axis=1) Out: [stack trace] ValueError: Shape of passed values is (5, 286), indices imply (5, 276) |
我也遇到过类似的问题(
检查
删除重复的索引值(例如,
我的问题是不同的索引,下面的代码解决了我的问题。
1 2 3 | df1.reset_index(drop=True, inplace=True) df2.reset_index(drop=True, inplace=True) df = pd.concat([df1, df2], axis=1) |
您的索引可能包含重复的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import pandas as pd T1_INDEX = [ 0, 1, # <= !!! if I write e.g.:"0" here then it fails 0.2, ] T1_COLUMNS = [ 'A', 'B', 'C', 'D' ] T1 = [ [1.0, 1.1, 1.2, 1.3], [2.0, 2.1, 2.2, 2.3], [3.0, 3.1, 3.2, 3.3], ] T2_INDEX = [ 1.2, 2.11, ] T2_COLUMNS = [ 'D', 'E', 'F', ] T2 = [ [54.0, 5324.1, 3234.2], [55.0, 14.5324, 2324.2], # [3.0, 3.1, 3.2], ] df1 = pd.DataFrame(T1, columns=T1_COLUMNS, index=T1_INDEX) df2 = pd.DataFrame(T2, columns=T2_COLUMNS, index=T2_INDEX) print(pd.concat([pd.DataFrame({})] + [df2, df1], axis=1)) |
Aus-Lacy的帖子让我想到尝试相关的方法,Join可以做到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | In [196]: hl.name = 'hl' Out[196]: 'hl' In [199]: df.join(hl).head(4) Out[199]: high low loc_h loc_l hl 2014-01-01 17:00:00 1.376235 1.375945 1.376235 1.375945 1.376090 2014-01-01 17:01:00 1.376005 1.375775 NaN NaN NaN 2014-01-01 17:02:00 1.375795 1.375445 NaN 1.375445 1.375445 2014-01-01 17:03:00 1.375625 1.375515 NaN NaN NaN |
一些洞察为什么concat在这个例子上有效,但是这些数据不是很好的!
这是错误的,但由于名声不好,我不能直接回复圆珠笔的评论。错误的原因是
相反,使用返回布尔列表的
尝试在连接索引后对其进行排序
1 | result=pd.concat([df1,df2]).sort_index() |