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

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: 

我错过了什么?


当前回答

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

其他回答

我总是在索引上使用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

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

我相信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提供了一个单一的功能,合并,作为所有的入口点 DataFrame对象之间的标准数据库连接操作: merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True 后缀=(“值”、“_y吗”),复制= True,指标= False)

和:

DataFrame。Join是一种方便的方法,用于组合两个列 潜在的不同索引的数据帧到一个单一的结果 DataFrame。这里有一个非常基本的例子:这里的数据对齐是打开的 索引(行标签)。同样的行为可以使用 Merge加上指示它使用索引的附加参数: Result = pd。merge(left, right, left_index=True, right_index=True, =“外”)

Join:默认索引(如果任何相同的列名,那么它将在默认模式下抛出一个错误,因为你没有定义lsuffix或rsuffix))

df_1.join(df_2)

合并:默认相同的列名(如果没有相同的列名,将在默认模式下抛出错误)

df_1.merge(df_2)

在这两种情况下,参数有不同的含义

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')