熊猫 concat: ValueError: 传递值的形状是胡说八道,索引意味着 blah2

我试图合并一个(熊猫14.1)数据框架和一个系列。该系列应该形成一个新列,其中包含一些 NA (因为该系列的索引值是数据框架的索引值的子集)。

This works for a toy example, but not with my data (detailed below).

例如:

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

数据的情况(见下文)基本上是相同的——用 DatetimeIndex 连接一个序列,其值是数据框架的子集。但是它在标题中给出了 ValueError (blah1 = (5,286) blah2 = (5,276))。为什么没用?:

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)
276990 次浏览

Aus_lacy's post gave me the idea of trying related methods, of which 加入 does work:

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 可以在示例上工作,而这些数据却不行,那就再好不过了!

I had a similar problem (join worked, but concat failed).

检查 df1s1中的重复索引值(例如 df1.index.is_unique)

删除重复的索引值(例如,df.drop_duplicates(inplace=True))或这里的 https://stackoverflow.com/a/34297689/7163376方法之一应该可以解决这个问题。

我的问题是不同的索引,下面的代码解决了我的问题。

df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat([df1, df2], axis=1)

您的索引可能包含重复的值。

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))

在连接索引后尝试对它们进行排序

result=pd.concat([df1,df2]).sort_index()

要删除重复的索引,请在15:25使用 df = df.loc[df.index.drop_duplicates()].C.F. Pandas.pydata.org/pandas-docs/stable/generated/.-BallpointBen Apr 18

这是错误的,但我不能直接回应 BallpointBen 的评论,因为声誉低下。其错误之处在于,df.index.drop_duplicates()返回一个唯一索引列表,但是当您使用这些唯一索引重新索引到数据框架时,它仍然返回所有记录。我认为这可能是因为使用重复索引之一的索引将返回索引的所有实例。

相反,使用 df.index.duplicated(),它返回一个布尔列表(添加 ~以获得不重复的记录) :

df = df.loc[~df.index.duplicated()]

也许很简单,试试这个 如果您有一个数据框架。然后确保您试图组合的矩阵或向量具有相同的 rows _ name/index

我遇到了同样的问题,我修改了行的名称索引,使它们彼此匹配 这里有一个矩阵(主成分)和向量(目标)具有相同行索引的例子(我在图片左侧用蓝色圈出了它们)

Before, "when it was not working", I had the matrix with normal row indicies (0,1,2,3) while I had the vector with row indices (ID0, ID1, ID2, ID3) 然后我将向量的行索引改为(0,1,2,3) ,这对我很有用。

在此输入图像描述