在Pandas中join和merge的区别是什么?

假设我有两个这样的数据框架:

left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})


right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})

我想合并它们,所以我尝试这样做:

pd.merge(left, right, left_on='key1', right_on='key2')

我很开心

    key1    lval    key2    rval
0   foo     1       foo     4
1   bar     2       bar     5

但我尝试使用join方法,我一直认为它非常相似。

left.join(right, on=['key1', 'key2'])

我得到了这个:

//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406             if self.right_index:
407                 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408                     raise AssertionError()
409                 self.right_on = [None] * n
410         elif self.right_on is not None:


AssertionError:

我错过了什么?

184023 次浏览

我总是在索引上使用join:

import pandas as pd
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}).set_index('key')
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}).set_index('key')
left.join(right, lsuffix='_l', rsuffix='_r')


val_l  val_r
key
foo      1      4
bar      2      5

通过在以下列上使用merge可以获得相同的功能:

left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]})
left.merge(right, on=('key'), suffixes=('_l', '_r'))


key  val_l  val_r
0  foo      1      4
1  bar      2      5

我相信join()只是一个方便的方法。试试df1.merge(df2),它允许你指定left_onright_on:

In [30]: left.merge(right, left_on="key1", right_on="key2")
Out[30]:
key1  lval key2  rval
0  foo     1  foo     4
1  bar     2  bar     5

这个文档

pandas提供了一个单独的函数merge,作为所有函数的入口点 DataFrame对象之间的标准数据库连接操作:

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)

和:

DataFrame.join是一个方便的组合两个列的方法 潜在的不同索引的数据帧到一个单一的结果 DataFrame。这里有一个非常基本的例子:这里的数据对齐是打开的 索引(行标签)。同样的行为可以使用 Merge加上指示它使用索引的附加参数:

result = pd.merge(left, right, left_index=True, right_index=True,
how='outer')

pandas.merge()是用于所有合并/连接行为的底层函数。

dataframe提供了pandas.DataFrame.merge()pandas.DataFrame.join()方法作为访问pandas.merge()功能的方便方式。例如,df1.merge(right=df2, ...)等价于pandas.merge(left=df1, right=df2, ...)

下面是df.join()df.merge()之间的主要区别:

  1. df1.join(df2)总是通过df2的索引连接,但是df1.merge(df2)可以连接到df2的一个或多个列(默认),或者连接到df2的索引(使用right_index=True)。
  2. 左表查找:默认情况下,df1.join(df2)使用df1的索引,而df1.merge(df2)使用df1的列。可以通过指定df1.join(df2, on=key_or_keys)df1.merge(df2, left_index=True)来覆盖。
  3. 左连接vs内连接:df1.join(df2)默认执行左连接(保留df1的所有行),但df.merge默认执行内连接(只返回匹配的df1df2行)。

因此,通用的方法是使用pandas.merge(df1, df2)df1.merge(df2)。但对于许多常见情况(保留df1的所有行并连接到df2中的索引),您可以通过使用df1.join(df2)来节省一些输入。

关于这些问题的一些注释来自http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging的文档:

merge是pandas命名空间中的一个函数,它也是 可用作为DataFrame实例方法,调用DataFrame

相关的DataFrame.join方法在内部使用merge来实现 索引对索引和索引对列的连接,但是通过 默认,而不是尝试连接公共列(默认 行为merge)。如果您正在加入索引,您可能希望

.使用DataFrame.join来节省一些输入

...

这两个函数调用是完全等价的:

left.join(right, on=key_or_keys)
pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)

其中一个区别是merge创建了一个新索引,而join保留了左边的索引。如果你错误地假设你的索引没有被merge改变,它会对你以后的转换产生很大的影响。

例如:

import pandas as pd


df1 = pd.DataFrame({'org_index': [101, 102, 103, 104],
'date': [201801, 201801, 201802, 201802],
'val': [1, 2, 3, 4]}, index=[101, 102, 103, 104])
df1


date  org_index  val
101  201801        101    1
102  201801        102    2
103  201802        103    3
104  201802        104    4

-

df2 = pd.DataFrame({'date': [201801, 201802], 'dateval': ['A', 'B']}).set_index('date')
df2


dateval
date
201801       A
201802       B

-

df1.merge(df2, on='date')


date  org_index  val dateval
0  201801        101    1       A
1  201801        102    2       A
2  201802        103    3       B
3  201802        104    4       B

-

df1.join(df2, on='date')
date  org_index  val dateval
101  201801        101    1       A
102  201801        102    2       A
103  201802        103    3       B
104  201802        104    4       B
  • Join:默认索引(如果任何相同的列名,那么它将在默认模式下抛出一个错误,因为你没有定义lsuffix或rsuffix))
df_1.join(df_2)
  • 合并:默认相同的列名(如果没有相同的列名,将在默认模式下抛出错误)
df_1.merge(df_2)
  • on参数在这两种情况下有不同的含义
df_1.merge(df_2, on='column_1')


df_1.join(df_2, on='column_1') // It will throw error
df_1.join(df_2.set_index('column_1'), on='column_1')

将其类比为SQL“熊猫合并是外部/内部连接,熊猫连接是自然连接”。因此,当你在pandas中使用merge时,你想要指定你想要使用哪种类型的sql连接,而当你使用pandas连接时,你真的想要有一个匹配的列标签来确保它连接