개요
2022.12.25 - [Python] Pandas - 데이터프레임 합성 1 (merge / join)에서 두 데이터프레임에 대한 INNER JOIN과 OUTER JOIN(left, right, full)에 대해서 살펴봤다.
이 글에서는 두 데이터프레임에 대한 LEFT ANTI JOIN, RIGHT ANTI JOIN... 즉, 차집합을 구하는 방법을 정리한다.
예시 데이터
예시로 아래의 데이터프레임 두 개를 사용하여 글을 작성한다.
import pandas as pd
df1 = pd.DataFrame(
[
(1, 345, 'B', True),
(2, 100, 'C', False),
(3, 300, 'B', False),
(4, 151, 'A', False),
(5, 212, 'A', True)
],
columns=['id', 'value', 'colC', 'colD']
)
df2 = pd.DataFrame(
[
(4, 151, 'A', False),
(5, 212, 'A', True),
(6, 121, 'C', False),
(7, 333, 'B', True),
(8, 456, 'C', True)
],
columns=['id', 'value', 'colC', 'colD']
)
출력
# df1
id value colC colD
0 1 345 B True
1 2 100 C False
2 3 300 B False
3 4 151 A False
4 5 212 A True
# df2
id value colC colD
0 4 151 A False
1 5 212 A True
2 6 121 C False
3 7 333 B True
4 8 456 C True
LEFT ANTI JOIN
pandas에서 제공하는 join과 merge만 이용해서는 차집합을 바로 추출해서 볼 수 없다. 이를 위해서는 다음과 같은 방식을 사용한다.
1. 데이터프레임 full outer merge
이때 indicator 매개변수를 True로 지정하면 각 행이 어느 데이터프레임에 속하는지 표시된다.
df = pd.merge(df1, df2, how='outer', indicator=True)
2. _merge 컬럼값이 left_only인 행만 필터링
df = df.query("_merge=='left_only'")
3. _merge 컬럼 삭제
df = df.drop(columns=['_merge'])
RIGHT ANTI JOIN
Right anti join은 왼쪽 데이터프레임에 있는 행만 필터링하는 left anti join에서 오른쪽 데이터프레임에 있는 행만 필터링하는 것으로 변경하면 된다.
pd.merge(df1, df2, how='outer', indicator=True)\
.query("_merge=='right_only'")\
.drop(columns=['_merge'])
참고 문서
https://codealone.tistory.com/78
https://towardsdatascience.com/how-to-merge-pandas-dataframes-221e49c41bec
https://towardsdatascience.com/why-is-nobody-talking-about-sql-anti-joins-f970a5f6cb54