我正在尝试合并(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
数据的情况(见下文)看起来基本相同 - 用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)
答案 0 :(得分:36)
我遇到了类似的问题(join
有效,但concat
失败了。
检查df1
和s1
中的重复索引值,(例如df1.index.is_unique)
删除重复的索引值(例如df.drop_duplicates(inplace=True)
)或其中一个方法https://stackoverflow.com/a/34297689/7163376应解决此问题。
答案 1 :(得分:10)
我的问题在哪里有不同的索引,下面的代码解决了我的问题。
df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
df = pd.concat([df1, df2], axis=1)
答案 2 :(得分:2)
Aus_lacy的帖子给了我尝试相关方法的想法,其中加入确实有效:
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适用于示例而不是这些数据的一些见解会很好!
答案 3 :(得分:2)
您的索引可能包含重复的值。
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))
答案 4 :(得分:0)
连接索引后尝试排序索引
$users[0]
答案 5 :(得分:0)
To drop duplicate indices, use df = df.loc[df.index.drop_duplicates()]. C.f. pandas.pydata.org/pandas-docs/stable/generated/… – BallpointBen Apr 18 at 15:25
这是错误的,但由于声誉低下,我无法直接回复BallpointBen的评论。错误的原因是df.index.drop_duplicates()
返回唯一索引的列表,但是当您使用这些唯一索引索引回数据框时,它仍会返回所有记录。我认为这很可能是因为使用重复索引之一的索引将返回该索引的所有实例。
相反,使用df.index.duplicated()
,它返回一个布尔列表(添加〜以获取未重复的记录):
df = df.loc[~df.index.duplicated()]
。
答案 6 :(得分:0)
也许很简单,试试看 如果您有DataFrame。然后确保您要合并的矩阵或vectros具有相同的rows_name / index
我有同样的问题。我更改了行的名称索引以使它们彼此匹配 这是一个矩阵(主要成分)和vector(目标)具有相同行索引的示例(我在图片左侧用蓝色圈出了它们)
之前,“当它不起作用时”,我有矩阵,其矩阵具有正常的行索引(0、1、2、3),而我的矢量具有行索引(ID0,ID1,ID2,ID3) 然后我将向量的行索引更改为(0,1,2,3),它对我有用。