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()
之间的主要区别:
- 在右表上查找:
df1.join(df2)
总是通过df2
的索引连接,但df1.merge(df2)
可以连接到df1.merge(df2)
一列或多列(默认)或df2
的索引(withright_index=True
) 。 - 在左表中查找:默认情况下,
df1.join(df2)
使用df1
的索引,df1.join(df2)
使用df1
列。 这可以通过指定df1.join(df2, on=key_or_keys)
或df1.merge(df2, right_index=True)
来覆盖。 - left vs inner join:
df1.join(df2)
在默认情况下执行左连接(保留df1
所有行),但df.merge
默认执行内连接(仅返回匹配的df1
和df2
行)。
所以,通用的方法是使用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_on
和right_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对象之间所有标准数据库连接操作的入口点:
合并(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')