Pandas의 join과 merge의 차이점은 무엇입니까?


208

두 개의 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: 

내가 무엇을 놓치고 있습니까?


4
여기에 특정 문제가 있다는 것입니다 merge의 열을 조인 left의 열을 right당신이 원하는 어떤을,하지만 join(... on=[...])의 열을 조인 left의 인덱스 키에 right당신이 원하는 바가 아니다. 자세한 내용은 아래 답변을 참조하십시오.
Matthias Fripp

3
DataFrame.join ()은 항상 호출자의 색인 또는 키 ( on옵션으로 지정)를의 색인과 일치 시키려고 other합니다. 조인을위한 인덱스를 기억하십시오. merge ()는 더 일반적인 방법입니다.
Jiapeng Zhang

답변:


87

나는 항상 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

오류는에 대한 다중 인덱스 right가 길이와 동일한 깊이를 예상한다고 말하는 것 같습니다 on. 그것은 나에게 일종의 의미가 있습니다. 시맨틱이 다르다는 것을 받아 들일 수 있습니다. 하지만 내가 df.join와 같은 동작을 얻을 수 있는지 알고 싶습니다
멍크

346

pandas.merge() 모든 병합 / 결합 동작에 사용되는 기본 함수입니다.

DataFrame은의 기능에 액세스하는 편리한 방법으로 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. 내부 대에 가입 왼쪽 : df1.join(df2)왼쪽은 기본적으로 가입 않습니다 (모든 행을 유지 df1)하지만, df.merge내부는 기본적으로 가입하지 (만 반환의 행을 일치 df1하고 df2).

따라서 일반적인 접근 방식은 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는 인덱스-인덱스 및 인덱스-온-컬럼 조인에 내부적으로 사용 되지만 공통 열에 대한 조인을 시도하지 않고 기본적으로 인덱스를 조인합니다 (의 기본 동작 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)

19
이것은 분명히 받아 들여질만한 대답이어야합니다! thourough 설명 주셔서 감사합니다
Yohan Obadia

@Matthias Fripp, 아마도 더 경험이 많은 것은 말할 것도 없지만 "오른쪽 테이블에 대한 조회 : df1.join (df2)은 df1.join (df2, on = key_or_keys?)로 대체 될 수 있습니다.
spacedustpi

@spacedustpi, on=key_or_keys오른쪽 테이블에서 행을 찾는 방법을 변경하는 데 사용할 수 있다고 생각 합니다. 그러나 실제로는 그렇지 않습니다. 이 on인수는 왼쪽 테이블 ( df1) 의 조회 를 색인에서 열로 변경합니다 . 그러나이 인수를 사용하더라도 df2인덱스를 통해 올바른 테이블 ( )이 일치합니다. (위의 마지막 예를보십시오.)
Matthias Fripp

Pandas에는 이러한 상황을 처리하는 여러 가지 방법이 있으며 병합, 결합, 추가, 연결, 결합, Combine_first 등이 있습니다. 하나의 상황에 가장 적합한 될 것이라고 대해 엿볼을 가지고 이들 각각을 살펴보십시오
xiaxio

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

11

에서 이 문서

pandas는 DataFrame 객체 간의 모든 표준 데이터베이스 조인 작업에 대한 진입 점으로 단일 함수 merge를 제공합니다.

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
      left_index=False, right_index=False, sort=True,
      suffixes=('_x', '_y'), copy=True, indicator=False)

그리고 :

DataFrame.join은 잠재적으로 다르게 인덱싱 된 두 DataFrame의 열을 단일 결과 DataFrame으로 결합하는 편리한 방법입니다. 다음은 매우 기본적인 예입니다. 여기서 데이터 정렬은 인덱스 (행 레이블)에 있습니다. 동일한 동작은 인덱스를 사용하도록 지시하는 merge와 추가 인수를 사용하여 달성 할 수 있습니다.

result = pd.merge(left, right, left_index=True, right_index=True,
how='outer')

8

차이점 중 하나는 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

맞아요. 인덱스 이외의 열에 두 데이터 프레임을 병합하면 새 인덱스가 생성되지만 두 데이터 프레임의 인덱스를 병합하면 동일한 인덱스의 데이터 프레임이 생성됩니다. 따라서 병합 후 동일한 색인을 얻기 위해 두 데이터 프레임 모두에 대해 열을 색인 (병합하려는 색인)으로 만든 다음 새로 작성된 색인에서 데이터 프레임을 병합 할 수 있습니다.
hasan najeeb

매우 통찰력이 있습니다. 나는 인덱싱이 필요하지 않았지만 (일반적으로 인덱스를 재설정) 어떤 경우에는 큰 차이가 생길 수 있습니다.
아이린

4
  • 조인 : 기본 색인 (열 이름이 같으면 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')

2

SQL과 유사하게 "팬더 병합은 외부 / 내부 조인이고 Pandas 조인은 자연 조인입니다." 따라서 팬더에서 병합을 사용할 때 사용할 종류의 sqlish 조인을 지정하려고하지만 팬더 조인을 사용할 때는 실제로 일치하도록 열 레이블을 갖기를 원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.