2014-03-27 41 views
59

假設我有兩個DataFrames像這樣:Pandas的加入和合並有什麼區別?

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: 

我缺少什麼?

+1

這裏的具體問題是,'merge'加入的'left'到列列' right',這是你想要的,但是'join(... on = [...])'將'left'的列連接到'right'的索引鍵,這不是你想要的。有關更多詳情,請參閱下面的答案。 –

回答

34

我總是在指數使用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 
+0

這個錯誤似乎是說它期望'right'上的多重索引與'on'上的長度具有相同的深度。這對我來說很有意義。我可以接受的是,語義是不同的。但我想知道,如果我可以通過df.join獲得相同的行爲 – munk

+0

@usmcs請參閱我的編輯。我不知道發生了什麼:/ –

8

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

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

大熊貓提供一個單一的功能,合併爲切入點所有 標準數據庫數據框對象之間的連接操作:

merge(left,right,how ='inner',on = None,left_on = None,right_on = None, left_index = False,right_index = False,sort = True, 個後綴=( '_ X', '_y'),複製=真,指示器=假)

和:

DataFrame.join是用於組合兩個 潛在的列的方便方法將不同索引的DataFrame組合成一個結果。這裏是一個非常基本的例子:這裏的數據對齊是 索引(行標籤)。可以使用 合併來實現此相同的行爲以及其他參數,指示它使用索引: 結果= pd.merge(左,右,left_index =真,right_index =真, 如何=「外」)

83

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(含right_index=True)索引。
  2. 在左表上查找:默認情況下,df1.join(df2)使用索引df1df1.merge(df2)使用df1的列。這可以通過指定df1.join(df2, on=key_or_keys)df1.merge(df2, right_index=True)來覆蓋。
  3. 離開VS內部聯接: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是大熊貓命名空間的功能,它也是 可以作爲一個數據幀實例方法,與呼叫數據幀 隱含地考慮連接中的左對象。

的相關DataFrame.join方法,使用merge內部的 索引上的索引上索引和索引的列(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)