在公共索引上连接数据帧

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 - 如何将多个数据帧的列连接成一个数据帧的列

连接多索引数据帧

具有数百万条记录的 2 个数据帧之间的 Pyspark 交叉连接

迭代稀疏矩阵并连接每一行的数据和索引

使用完全外连接合并两个数据帧在两个数据帧上没有获得关键列