Pandas concat:ValueError:传递值的形状为blah,indices表示blah2

bir*_*one 50 python pandas

我正在尝试合并(Pandas 14.1)数据帧和一系列.该系列应该与一些NA形成一个新列(因为该系列的索引值是数据帧的索引值的子集).

这适用于玩具示例,但不适用于我的数据(详见下文).

例:

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
Run Code Online (Sandbox Code Playgroud)

数据的情况(见下文)似乎基本相同 - 用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)
Run Code Online (Sandbox Code Playgroud)

lma*_*999 47

我有类似的问题(join工作,但concat失败了).

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

删除重复的索引值(例如df.drop_duplicates(inplace=True))或其中一个方法/sf/answers/2400838261/应该解决它.

  • 这工作谢谢!我这样做:df = pd.concat([df1,df2],axis = 1,join_axes = [df1.index]).如果我在df2中有重复,那么我得到这个错误.这是有道理的,因为它不知道如何跨两个DF映射多个重复索引. (3认同)
  • 要删除重复索引,请使用 `df = df.loc[df.index.drop_duplicates()]`。参见 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.drop_duplicates.html (3认同)
  • 检查两个索引中重复索引值的建议可能会帮助许多人阅读这个问题 (3认同)

flo*_*low 15

我的问题在哪里不同的索引,下面的代码解决了我的问题.

df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat([df1, df2], axis=1)
Run Code Online (Sandbox Code Playgroud)


bir*_*one 5

Aus_lacy 的帖子给了我尝试相关方法的想法,其中join确实有效:

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
Run Code Online (Sandbox Code Playgroud)

深入了解为什么 concat 对示例有效但对这些数据无效的一些见解会很好!


Jer*_*att 5

要删除重复的索引,请使用df = df.loc[df.index.drop_duplicates()]. CF pandas.pydata.org/pandas-docs/stable/generated/... - BallpointBen 4月18日15:25

这是错误的,但由于声誉低,我无法直接回复 BallpointBen 的评论。其错误的原因是df.index.drop_duplicates()返回唯一索引列表,但是当您使用这些唯一索引索引回数据帧时,它仍然返回所有记录。我认为这很可能是因为使用重复索引之一进行索引将返回索引的所有实例。

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

df = df.loc[~df.index.duplicated()]
Run Code Online (Sandbox Code Playgroud)