두 개의 DataFrame을 비교하다 보면 한쪽에만 존재하는 행, 즉 공통되지 않은(uncommon) 행을 찾아야 할 때가 있습니다. Pandas에서는 concat() 메서드와 drop_duplicates()를 조합하면 이 작업을 아주 간단하게 처리할 수 있습니다.
핵심 원리
방법은 크게 두 단계로 이루어집니다.
pd.concat()으로 두 DataFrame을 위아래로 하나로 합칩니다.drop_duplicates(keep=False)를 적용해 중복된 행을 모두 제거합니다.
여기서 keep=False 옵션이 핵심입니다. 기본값인 keep='first'는 중복된 행 중 첫 번째만 남기지만, keep=False는 중복된 행 전체를 삭제합니다. 따라서 양쪽 DataFrame에 공통으로 존재하는 행은 모두 사라지고, 한쪽에만 있는 행만 최종 결과에 남게 됩니다.
예제 준비
1. 라이브러리 임포트
import pandas as pd
2. 첫 번째 DataFrame 생성
dataFrame1 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
}
)
3. 두 번째 DataFrame 생성
dataFrame2 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1300, 1000, 800, 1100, 800]
}
)
두 DataFrame은 동일한 차량 목록을 담고 있지만, 등록 가격(Reg_Price)이 일부 다릅니다. BMW, Tesla, Bentley는 완전히 동일한 행이며, Lexus, Audi, Jaguar는 가격이 달라 서로 다른 행입니다.
4. 공통되지 않은 행 찾기
result = pd.concat([dataFrame1, dataFrame2]).drop_duplicates(keep=False)
print("\n두 DataFrame 사이의 공통되지 않은 행...\n", result)
전체 코드
import pandas as pd
# 첫 번째 DataFrame 생성
dataFrame1 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
}
)
print("DataFrame1 ...\n", dataFrame1)
# 두 번째 DataFrame 생성
dataFrame2 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1300, 1000, 800, 1100, 800]
}
)
print("\nDataFrame2 ...\n", dataFrame2)
# 두 DataFrame 사이의 공통되지 않은 행 찾기
print("\nUncommon rows between two DataFrames...\n",
pd.concat([dataFrame1, dataFrame2]).drop_duplicates(keep=False))
실행 결과
DataFrame1 ...
Car Reg_Price
0 BMW 1000
1 Lexus 1500
2 Audi 1100
3 Tesla 800
4 Bentley 1100
5 Jaguar 900
DataFrame2 ...
Car Reg_Price
0 BMW 1000
1 Lexus 1300
2 Audi 1000
3 Tesla 800
4 Bentley 1100
5 Jaguar 800
Uncommon rows between two DataFrames...
Car Reg_Price
1 Lexus 1500
2 Audi 1100
5 Jaguar 900
1 Lexus 1300
2 Audi 1000
5 Jaguar 800
결과 해석
출력 결과를 살펴보면 BMW(1000), Tesla(800), Bentley(1100) 행은 두 DataFrame에서 완전히 동일했기 때문에 모두 제거되었습니다. 반면 Lexus, Audi, Jaguar는 두 DataFrame에서 가격이 서로 달랐기 때문에 각 버전이 모두 결과에 그대로 남아 있는 것을 확인할 수 있습니다.
마무리
pd.concat()과 drop_duplicates(keep=False)의 조합은 두 DataFrame 간의 차이를 찾는 가장 간단하고 직관적인 방법입니다. 집합 연산과 유사하게 동작하기 때문에 데이터 검증, 변경 사항 비교, 이상치 탐지 등 다양한 상황에서 유용하게 활용할 수 있습니다.