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

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

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



답변

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


답변

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)

답변

나는 그것이 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


답변

에서 이 문서

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

답변

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


답변

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


답변

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