두 개의 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()
같습니다.
- 오른쪽 테이블에서 조회 :
df1.join(df2)
는의 인덱스를 통해 항상 조인df2
하지만df1.merge(df2)
하나 이상의 열df2
(기본값) 또는 인덱스df2
(withright_index=True
)에 조인 할 수 있습니다 . - 왼쪽 룩업 테이블에 기본적으로
df1.join(df2)
의 사용 지수df1
와df1.merge(df2)
의 사용 칼럼 (들)df1
. 즉 지정하여 대체 할 수 있습니다df1.join(df2, on=key_or_keys)
또는df1.merge(df2, left_index=True)
. - 내부 대에 가입 왼쪽 :
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_on
및 right_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 조인을 지정하려고하지만 팬더 조인을 사용할 때는 실제로 일치하도록 열 레이블을 갖기를 원합니다.