Python의 pandas
를 활용하다 보면, 두 개의 DataFrame을 비교하여 한쪽에 포함된 값을 다른 쪽에서 제거해야 하는 상황이 자주 발생합니다. 예를 들어, 이미 처리된 데이터를 제거하거나, 제외 대상 명단을 기반으로 전체 목록을 정리할 때 사용할 수 있습니다.
이번 글에서는 이와 같은 상황에서 사용할 수 있는 isin()
과 merge()
함수 활용법을 예시와 함께 소개해드리겠습니다.
문제 상황 정리
두 개의 DataFrame a
와 b
가 있다고 가정합니다. 이때 a
에 포함된 값을 기준으로, 해당 값이 포함된 행을 b
에서 제거하고자 합니다.
단일 열 기준으로 비교하고 제거하기
가장 간단한 경우는 한 개의 열(예: id)을 기준으로 비교하는 방법입니다.
import pandas as pd
# 예시 데이터
a = pd.DataFrame({'id': [1, 2, 3]})
b = pd.DataFrame({'id': [2, 3, 4, 5]})
# a에 포함된 id를 기준으로 b에서 제거
b_filtered = b[~b['id'].isin(a['id'])]
print(b_filtered)
이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
id
0 4
1 5
여기서 isin()
함수는 b['id']
의 각 값이 a['id']
에 포함되는지를 판단하고, ~
연산자를 사용하여 포함되는 값을 제외시킵니다. 최종적으로 a
에 들어 있는 ID를 b
에서 제거한 결과가 b_filtered
에 저장됩니다.
여러 열을 기준으로 비교하고 제거하기
두 개 이상의 열을 기준으로 행 전체를 비교하고 싶을 때는 merge()
함수와 indicator=True
옵션을 활용하는 방법이 유용합니다.
# 예시 데이터
a = pd.DataFrame({'id': [1, 2], 'name': ['Alice', 'Bob']})
b = pd.DataFrame({'id': [2, 3], 'name': ['Bob', 'Charlie']})
# 병합하여 공통 항목 확인
merged = pd.merge(b, a, on=['id', 'name'], how='left', indicator=True)
# 공통 항목 제외
b_filtered = merged[merged['_merge'] == 'left_only'].drop(columns=['_merge'])
print(b_filtered)
위 코드를 실행하면 다음과 같은 결과가 나옵니다.
id name
1 3 Charlie
여기서 indicator=True
옵션을 통해 _merge
열이 생성되며, 해당 열을 기준으로 b
에만 있는 행만 남길 수 있습니다. 이렇게 하면 다중 조건 비교 후 제거 작업도 손쉽게 수행할 수 있습니다.
마무리: 정리
- 한 개의 열을 기준으로 비교할 경우
isin()
과~
연산자를 활용하여 제거할 수 있습니다. - 여러 열을 기준으로 비교할 경우
merge()
함수와indicator=True
옵션을 사용하면 효과적입니다. - 필터링 결과는 새로운 DataFrame으로 저장하여 후속 작업에 활용할 수 있습니다.
이와 같은 방식은 데이터 전처리 과정에서 불필요한 행을 제거하거나 중복 작업을 방지할 때 매우 유용하게 사용할 수 있습니다. 필요에 따라 상황에 맞는 방법을 선택하여 적용해 보시기 바랍니다.
'개발 (Development) > Python' 카테고리의 다른 글
[Python] 딕셔너리에서 정규표현식으로 특정 형식의 키 추출하기 (4) | 2025.07.28 |
---|---|
[Python] Pandas DataFrame에서 조건에 따라 행 삭제 및 특정 데이터 추출하는 방법 정리 (2) | 2025.07.20 |
[Python] JSON 파일을 CSV로 변환 (1) | 2025.06.01 |
[Python] 배열을 1000개 단위로 나누어 처리하는 방법 (0) | 2025.05.18 |
[Python] Pandas DataFrame에서 값이 저장되지 않는 이유와 해결 방법 (0) | 2025.05.18 |