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

mun*_*unk 171 python join dataframe pandas

假设我有两个这样的DataFrame:

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

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

我想合并它们,所以我尝试这样的事情:

pd.merge(left, right, left_on='key1', right_on='key2')
Run Code Online (Sandbox Code Playgroud)

而且我很高兴

    key1    lval    key2    rval
0   foo     1       foo     4
1   bar     2       bar     5
Run Code Online (Sandbox Code Playgroud)

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

left.join(right, on=['key1', 'key2'])
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

//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: 
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Mat*_*ipp 268

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(默认)的一个或多个列或df2(with right_index=True)的索引.
  2. 在左表上查找:默认情况下,df1.join(df2)使用索引df1df1.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默认情况下执行内连接(仅返回匹配的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内部用于index-on-index和index-on-column(s)连接,但默认情况下连接索引而不是尝试连接公共列(默认行为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)
Run Code Online (Sandbox Code Playgroud)

  • 这绝对应该是公认的答案!谢谢你的解释 (9认同)

Pau*_*l H 75

我总是使用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
Run Code Online (Sandbox Code Playgroud)

通过使用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
Run Code Online (Sandbox Code Playgroud)


Noa*_*oah 13

我相信这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
Run Code Online (Sandbox Code Playgroud)


Rom*_*uin 8

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中.这是一个非常基本的示例:此处的数据对齐位于索引(行标签)上.使用merge和其他参数指示它使用索引可以实现相同的行为:result = pd.merge(left,right,left_index = True,right_index = True,how ='outer')


ste*_*eco 7

区别之一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
Run Code Online (Sandbox Code Playgroud)

--

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

       dateval
date          
201801       A
201802       B
Run Code Online (Sandbox Code Playgroud)

--

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
Run Code Online (Sandbox Code Playgroud)

--

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
Run Code Online (Sandbox Code Playgroud)

  • 那是对的。如果我们合并索引以外的列上的两个数据帧,我们将得到一个新索引,但如果我们合并两个数据帧的索引,我们将得到具有相同索引的数据帧。因此,为了在合并后获得相同的索引,我们可以将两个数据帧的列作为我们要合并的索引,然后在新创建的索引上合并数据帧。 (2认同)

小智 5

  • 加入:默认索引(如果有任何相同的列名,那么它会在默认模式下抛出错误,因为你没有定义 lsuffix 或 rsuffix))
df_1.join(df_2)
Run Code Online (Sandbox Code Playgroud)
  • 合并:默认相同的列名(如果没有相同的列名,它将在默认模式下引发错误)
df_1.merge(df_2)
Run Code Online (Sandbox Code Playgroud)
  • 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')
Run Code Online (Sandbox Code Playgroud)


小智 5

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