我正试图合并一个(Pandas14.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
数据的情况(见下文)看起来基本相同--将一个序列与一个日期时间索引联系起来,该索引的值是 Dataframe 的子集。但是它在标题中给出了ValueError(blah 1 =(5,286)blah 2 =(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)
8条答案
按热度按时间nhhxz33t1#
我遇到了类似的问题(
join
工作,但concat
失败)。检查
df1
和s1
中的重复索引值(例如,df1.index.is_unique
)删除重复的索引值(例如,
df.drop_duplicates(inplace=True)
)或这里的方法之一https://stackoverflow.com/a/34297689/7163376应该可以解决它。aelbi1ox2#
我的问题是不同的索引,下面的代码解决了我的问题。
jyztefdp3#
要删除重复的索引,请使用
df = df.loc[df.index.drop_duplicates()]
。C.f. pandas.pydata.org/pandas-docs/stable/generated/…- BallpointBen 4月18日15:25这是错误的,但我不能直接回复BallpointBen的评论,由于低声誉。错误的原因是
df.index.drop_duplicates()
返回一个唯一索引的列表,但是当你使用这些唯一索引索引返回到数据库框架时,它仍然返回所有记录。我认为这可能是因为使用其中一个重复索引的索引将返回该索引的所有示例。相反,使用
df.index.duplicated()
,它返回一个布尔列表(添加~
以获得不重复的记录):a9wyjsp74#
Aus_lacy的帖子给了我尝试相关方法的想法,其中join确实有效:
了解一下为什么concat可以在这个例子上工作,而不是这个数据,这将是很好的!
klsxnrf15#
您的索引可能包含重复的值。
mwngjboj6#
尝试排序索引后,连接它们
b91juud37#
如果尝试在
axis=0
上进行concat,这对我很有效(转换为记录列表):zfycwa2u8#
也许这很简单,如果你有一个DataFrame,试试这个。然后确保您尝试合并的两个矩阵或向量具有相同的rows_name/index
我也有同样的问题。我改变了行的名称索引,使它们彼此匹配,这里是一个矩阵(主成分)和向量(目标)具有相同行索引的示例(我在图片左侧的蓝色圈出了它们)
之前,“当它不工作时”,我有一个正常行索引的矩阵(0,1,2,3),而我有一个行索引的向量(ID 0,ID 1,ID 2,ID 3),然后我把向量的行索引改为(0,1,2,3),它对我有效。
enter image description here