현재 선택된 솔루션이 잘못된 결과를 생성합니다. 제대로이 문제를 해결하기 위해, 우리는이에서 왼쪽 조인을 수행 할 수 있습니다 df1
에 df2
처음만을위한 고유 행을 얻을 수 있는지에있어 df2
.
먼저, 데이터가있는 행을 추가하기 위해 원본 DataFrame을 수정해야합니다 [3, 10].
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3],
'col2' : [10, 11, 12, 13, 14, 10]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
'col2' : [10, 11, 12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
5 3 10
df2
col1 col2
0 1 10
1 2 11
2 3 12
왼쪽 조인을 수행하여 df2
각 행이 df1
정확히 1 행의 조인 되도록 중복을 제거하십시오 df2
. 매개 변수 indicator
를 사용하여 행이 어느 테이블에 있는지를 나타내는 추가 열을 리턴 하십시오 .
df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'],
how='left', indicator=True)
df_all
col1 col2 _merge
0 1 10 both
1 2 11 both
2 3 12 both
3 4 13 left_only
4 5 14 left_only
5 3 10 left_only
부울 조건을 만듭니다.
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
다른 솔루션이 잘못된 이유
일부 솔루션은 동일한 실수를합니다. 각 값이 동일한 행이 아니라 각 열에 독립적으로 있는지 확인합니다. 고유하지만 두 열의 값이있는 마지막 행을 추가하면 df2
실수 가 노출됩니다.
common = df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
이 솔루션은 동일한 잘못된 결과를 얻습니다.
df1.isin(df2.to_dict('l')).all(1)