在公共索引上连接数据帧
Posted
技术标签:
【中文标题】在公共索引上连接数据帧【英文标题】:Concatenating dataframes on a common index 【发布时间】:2018-02-26 10:20:08 【问题描述】:我目前正在编写一个程序,并且有两个数据帧,由字符串索引,格式如下:
col1 col2 col3 col4
row1 65 24 47 35
row2 33 48 25 89
row3 65 34 67 34
row4 24 12 52 17
和
col5 col6
row1 81 58
row2 25 36
row3 67 70
row4 52 82
并希望将帧合并/加入/连接成如下所示的内容:
col1 col2 col3 col4 col5 col6
row1 65 24 47 35 81 58
row2 33 48 25 89 25 36
row3 65 34 67 34 67 70
row4 24 12 52 17 52 82
对于我尝试过的每一种方法,并且在阅读了关于合并/连接/连接的 Pandas 文档后,我无法找到一种方法来执行这种没有重复行索引的合并,并且通常这些操作会产生一些看起来像这个:
col1 col2 col3 col4 col5 col6
row1 65 24 47 35
row2 33 48 25 89
row3 65 34 67 34
row4 24 12 52 17
row1 81 58
row2 25 36
row3 67 70
row4 52 82
但是,这不是我想要的数据格式。 执行合并的最有效方法是什么,以便将具有相同索引的值合并在一起?请注意,在某些情况下,数据框也可能具有不同的维度。
【问题讨论】:
向我们展示您的尝试。这是一个简单的水平合并:pd.concat([df1, df2], axis=1)
.
我试过使用 pd.concat;我收到以下错误:ValueError:传递值的形状为 (8, 35),索引暗示 (8, 34)
【参考方案1】:
pd.concat
沿第一轴
pd.concat([df1, df2], 1)
col1 col2 col3 col4 col5 col6
row1 65 24 47 35 81 58
row2 33 48 25 89 25 36
row3 65 34 67 34 67 70
row4 24 12 52 17 52 82
如果是你的索引有问题,可以加个参数ignore_index=True
:
df = pd.concat([df1, df2], 1, ignore_index=True)
df
0 1 2 3 4 5
row1 65 24 47 35 81 58
row2 33 48 25 89 25 36
row3 65 34 67 34 67 70
row4 24 12 52 17 52 82
DataFrame.align
另一种选择,
df3, df4 = df1.align(df2)
df3.fillna(0) + df4.fillna(0)
col1 col2 col3 col4 col5 col6
row1 65.0 24.0 47.0 35.0 81.0 58.0
row2 33.0 48.0 25.0 89.0 25.0 36.0
row3 65.0 34.0 67.0 34.0 67.0 70.0
row4 24.0 12.0 52.0 17.0 52.0 82.0
【讨论】:
concat 应该可以工作,但我认为我遇到了错误,因为我正在尝试合并两个形状/大小不等的数据框。使用 pd.concat 会出现以下错误: ValueError: Shape of passed values is (8, 35), indices imply (8, 34) 也许问题出在我的索引上?会很奇怪,数据帧由字符串索引 @ice_cream 试试这个:df1, df2 = df1.align(df2); df = df1 + df2
;
@ice_cream 等等,我需要给你该行的修改版本。
@ice_cream 所有的列都是数字的吗?如果是,您可以这样做:df3, df4 = df1.align(df2); df = df3.fillna(0) + df4.fillna(0)
列也被字符串索引以上是关于在公共索引上连接数据帧的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark - 如何将多个数据帧的列连接成一个数据帧的列