Python/NumPy | Pandas

[Python] Pandas - Dataframe 차집합 구하기

비번변경 2023. 5. 1. 22:24

개요

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