pandas – 连接和合并的区别

假设我有两个DataFrame,像这样:

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 

但是我正在尝试使用连接方法,我一直认为它非常相似。

 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: 

我错过了什么?

我总是使用索引连接:

 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可以具有相同的function:

 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 

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

DataFrames提供pandas.DataFrame.merge()pandas.DataFrame.join()方法作为访问pandas.merge()的function的便捷方式。 例如, df1.merge(right=df2, ...)等同于pandas.merge(left=df1, right=df2, ...)

这些是df.join()df.merge()之间的主要区别:

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

所以,通用的方法是使用pandas.merge(df1, df2)df1.merge(df2) 。 但是对于一些常见的情况(保留df1所有行并将其连接到df2的索引),可以使用df1.join(df2)来保存一些input。

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

merge是pandas命名空间中的一个函数,也可以作为DataFrame实例方法使用,调用的DataFrame被隐式地视为连接中的左对象。

相关的DataFrame.join方法在内部使用merge索引索引和索引列连接,但默认情况下连接索引,而不是尝试连接到公共列(默认merge行为)。 如果你join索引,你可能希望使用DataFrame.join来保存一些input。

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

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

我相信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 

http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebra

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

合并(left,right,how ='inner',on = None,left_on = None,right_on = None,left_index = False,right_index = False,sort = True,suffixes =('_ x','_y'),copy =确实,指标=假)

和:

DataFrame.join是将两个潜在索引不同的DataFrame的列组合成单个结果DataFrame的一种便捷方法。 这里是一个非常基本的例子:这里的数据alignment是在索引(行标签)上。 同样的行为可以通过使用merge和附加的参数指示它使用索引来实现:result = pd.merge(left,right,left_index = True,right_index = True,how ='outer')