按索引合并两个数据框。

322

我有以下数据框:

> df1
  id  begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B
我应该如何将索引合并以获得以下结果:
  id  begin conditional confidence discoveryTechnique concept 
0 278    56       false        0.0                  1       A 
1 421    18       false        0.0                  1       B

我问这个问题是因为我理解merge(),也就是df1.merge(df2)使用列来进行匹配。实际上,我这样做得到的结果是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

在索引上进行合并是不好的实践吗?这是不可能的吗?如果是这样,我该如何将索引移动到一个名为"index"的新列中?


10
尝试这个:df1.join(df2),意思是将两个数据框按照它们的索引(index)进行合并。 - MaxU - stand with Ukraine
1
如果您想按照一个数据框的索引和第二个数据框的一列进行连接,该怎么办呢?(我的第二个数据框有一列与第一个数据框中的索引相匹配。) - mikey
7个回答

637

使用merge函数进行内连接(默认):

pd.merge(df1, df2, left_index=True, right_index=True)

或者join函数,默认进行左连接:

df1.join(df2)

或者concat,默认情况下是外连接:

pd.concat([df1, df2], axis=1)

样本:

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

# Default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

# Default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

# Default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

47

您可以使用concat([df1, df2, ...], axis=1)函数将两个或多个按索引对齐的DF连接在一起:

pd.concat([df1, df2, df3, ...], axis=1)

或者使用merge函数来根据自定义字段/索引进行连接:

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

或者使用join按索引进行连接:


 df1.join(df2)

16
这个答案已经解决了一段时间,所有可用的选项都已经出现了。然而,在这个答案中,我将尝试更详细地介绍这些选项,以帮助您了解何时使用什么。
本文将涵盖以下主题:
- 在不同条件下与索引合并 - 基于索引连接的选项:`merge`、`join`、`concat` - 在索引上合并 - 在一个数据框的索引和另一个数据框的列上合并 - 有效使用命名索引简化合并语法

基于索引的连接

简介

根据使用情况,有几种选项,其中一些比其他选项更简单。

  1. DataFrame.merge 使用 left_indexright_index(或使用命名索引的 left_onright_on
  2. DataFrame.join(基于索引的连接)
  3. pd.concat(基于索引的连接)
优点 缺点
merge

• 支持内/左/右/全连接
• 支持列-列、索引-列、索引-索引连接

• 一次只能连接两个数据框

join

• 支持内/左(默认)/右/全连接
• 可以同时连接多个数据框

• 只支持索引-索引连接

concat

• 专门用于同时连接多个数据框
• 连接速度非常快(拼接是线性时间)

• 只支持内/全(默认)连接
• 只支持索引-索引连接


索引对索引的连接

通常,使用索引内连接将如下所示:

left.merge(right, left_index=True, right_index=True)

其他类型的连接(左连接、右连接、外连接)遵循类似的语法(可以使用how=...进行控制)。

值得注意的替代方案

  1. DataFrame.join 默认左连接数据的索引。

     left.join(right, how='inner',)
    

    如果你遇到了 ValueError: columns overlap but no suffix specified,那么你需要指定 lsuffixrsuffix= 参数来解决这个问题。由于列名相同,需要一个不同的后缀来区分它们。

  2. pd.concat 在索引上连接两个或多个 DataFrame,并且默认进行完全外连接。

     pd.concat([left, right], axis=1, sort=False)
    

    有关 concat 的更多信息,请查看 this post


索引到列的连接

要使用左侧的索引和右侧的列执行内部连接,您将使用DataFrame.merge,结合使用left_index=Trueright_on=...

left.merge(right, left_index=True, right_on='key')

其他连接遵循类似的结构。请注意,只有merge可以执行索引到列的连接。您可以在多个级别/列上进行连接,前提是左侧的索引级别数量等于右侧的列数。

joinconcat无法进行混合合并。您需要使用DataFrame.set_index将索引设置为预步骤。


本文是我在Pandas Merging 101中的工作摘要。请点击此链接获取更多示例和有关合并的其他主题。


15

默认情况下:
join 是按列进行左连接
pd.merge 是按列进行内连接
pd.concat 是按行进行外连接

pd.concat:
接受可迭代参数,因此不能直接使用数据框(使用 [df,df2]
数据框的维度应在轴上匹配

Joinpd.merge:
可以接受数据框参数


13
一个愚蠢的错误让我困扰了好久:连接失败是因为索引dtypes不同。这并不明显,因为两个表都是同一个原始表的数据透视表。在使用reset_index之后,在Jupyter中,它们看起来是相同的。只有在保存为Excel时,这个问题才浮出水面......

我用以下代码解决了问题:df1[['key']] = df1[['key']].apply(pd.to_numeric)

希望这篇文章能够帮助到某些人节省一小时时间!


7

如果你想在Pandas中合并两个数据框,你可以使用可用的属性,例如mergeconcatenate

例如,如果我有两个数据框df1df2,我可以通过以下方法进行合并:

newdataframe = merge(df1, df2, left_index=True, right_index=True)

这个答案已经在2年前由jezrael提供了。你为什么要发布相同的答案? - Sheldore

6
你可以尝试以下几种方法来合并/连接你的数据框。
  1. merge (默认为内连接)

    df = pd.merge(df1, df2, left_index=True, right_index=True)

  2. join (默认为左连接)

    df = df1.join(df2)

  3. concat (默认为外连接)

    df = pd.concat([df1, df2], axis=1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接