pandas를 이용한 DataFrame 차집합 구하기
두 DataFrame 간 특정 컬럼을 기준으로 데이터 차집합을 구하는 방법은 데이터를 정리하고 분석할 때 자주 사용됩니다. 예를 들어, 두 데이터셋의 공통 컬럼을 기준으로 df_a
에는 존재하지만 df_b
에는 없는 데이터를 필터링하고 싶을 때 pandas
를 사용하여 쉽게 구현할 수 있습니다.
여기서는 physical_name
이라는 컬럼을 기준으로 df_a - df_b
의 차집합을 구하는 방법을 소개합니다.
예제 데이터 생성
import pandas as pd
# DataFrame 예시 생성
df_a = pd.DataFrame({
'physical_name': ['a', 'b', 'c', 'd'],
'value': [1, 2, 3, 4]
})
df_b = pd.DataFrame({
'physical_name': ['b', 'd'],
'value': [2, 4]
})
위와 같은 데이터프레임이 있을 때, df_a
의 physical_name
컬럼을 기준으로 df_b
에 없는 데이터를 필터링하려고 합니다.
방법 1: isin
함수 사용
pandas
의 isin
함수는 특정 컬럼의 값을 기준으로 손쉽게 필터링할 수 있습니다. 아래는 df_a
에서 df_b
의 physical_name
값에 해당하지 않는 데이터를 선택하는 코드입니다.
# df_a에서 df_b에 없는 physical_name만 선택
df_diff = df_a[~df_a['physical_name'].isin(df_b['physical_name'])]
print(df_diff)
출력 결과
physical_name value
0 a 1
2 c 3
~
연산자는 isin
함수 결과를 반전시켜, df_b
의 physical_name
컬럼에 없는 데이터만 필터링합니다.
방법 2: merge
함수 사용
pandas
의 merge
함수와 indicator
옵션을 사용하면, 두 DataFrame 간 조인 상태를 나타내는 _merge
컬럼을 생성할 수 있습니다. 이를 활용해 차집합을 구하는 방법은 다음과 같습니다.
# df_a와 df_b를 left join하고 indicator로 상태 표시
df_diff = df_a.merge(df_b, on='physical_name', how='left', indicator=True)
# left_only인 행만 필터링
df_diff = df_diff[df_diff['_merge'] == 'left_only'].drop(columns=['_merge'])
print(df_diff)
출력 결과
physical_name value_x
0 a 1
2 c 3
설명
how='left'
:df_a
의 모든 행을 유지하면서df_b
와 조인합니다.indicator=True
:_merge
컬럼을 생성하여 조인 결과를 표시합니다.left_only
:df_a
에만 있는 행both
:df_a
와df_b
모두에 있는 행right_only
:df_b
에만 있는 행
_merge
값이left_only
인 행만 필터링하여 결과를 얻습니다.
정리
방법 | 장점 | 단점 |
isin 함수 | 간단하고 직관적임 | 특정 컬럼 기준으로만 동작 |
merge 함수 | 조인 상태를 세부적으로 확인 가능 | 코드가 약간 복잡 |
두 방법 모두 동일한 결과를 얻을 수 있으므로, 상황에 맞게 선택하면 됩니다. 단순히 특정 컬럼 기준으로 데이터를 필터링하려면 isin
함수를 사용하는 것이 간단하고 효율적입니다. 하지만 조인 결과를 더 세부적으로 분석하려면 merge
방식을 사용하는 것이 좋습니다.
반응형
'개발 (Development) > Python' 카테고리의 다른 글
[Python] Docker image load (0) | 2025.02.23 |
---|---|
[Python] Python을 활용한 서로 다른 데이터베이스 쿼리 결과 비교 및 엑셀 매핑 (0) | 2025.01.12 |
[Python] Excel 파일 간 문장 유사도 비교하기 (0) | 2025.01.12 |
[Python] 엑셀 파일 간 데이터 비교 (여러 시트일 때) (0) | 2025.01.12 |
[Python] 패키지 설치 SSL Error 해결 (0) | 2025.01.05 |