Pandas中加入和合并有什么区别?

时间:2014-03-27 00:42:47

标签: python pandas dataframe join

假设我有两个这样的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

但是我正在尝试使用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: 

我错过了什么?

7 个答案:

答案 0 :(得分:214)

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

DataFrames提供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的一列或多列(默认)或索引df2right_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. left vs inner join:df1.join(df2)默认情况下执行左连接(保留df1的所有行),但df.merge默认执行内连接(仅返回匹配的{ {1}}和df1)。
  4. 因此,通用方法是使用df2pandas.merge(df1, df2)。但是对于许多常见情况(保留df1.merge(df2)的所有行并加入df1中的索引),您可以使用df2来保存一些输入。

    http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging上的文档中有关这些问题的一些注意事项:

      

    df1.join(df2)是pandas命名空间中的一个函数,它也是   可以作为DataFrame实例方法使用,调用DataFrame   被隐含地视为联接中的左对象。

         

    相关的merge方法,在内部使用DataFrame.join   index-on-index和index-on-column(s)连接,但是连接索引   默认而不是尝试加入公共列(默认值   merge)的行为。如果您要加入索引,您可能希望   使用merge为自己节省一些打字。

    ...

      

    这两个函数调用完全等效:

    DataFrame.join

答案 1 :(得分:61)

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

答案 2 :(得分:11)

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

答案 3 :(得分:7)

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

  

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

     

合并(左,右,如何='内部',开=无,左_on =无,右_on =无,         left_index = False,right_index = False,sort = True,         后缀=(' _x',' _y'),copy = True,指示符= False)

并且:

  

DataFrame.join是一种组合两列的便捷方法   可能将不同索引的DataFrame转换为单个结果   数据帧。这是一个非常基本的示例:此处的数据对齐已打开   索引(行标签)。使用可以实现相同的行为   merge以及指示其使用索引的其他参数:   result = pd.merge(left,right,left_index = True,right_index = True,   如何='外&#39)

答案 4 :(得分:2)

区别之一是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

答案 5 :(得分:1)

  • 连接:默认索引(如果使用相同的列名,则由于您尚未定义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')

答案 6 :(得分:0)

类似于SQL,“ Pandas合并是外部/内部联接,Pandas联接是自然联接”。因此,当您在熊猫中使用合并时,您想要指定要使用哪种sqlish联接,而当使用熊猫联接时,您确实想要一个匹配的列标签以确保其联接