Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Pandas로 두 DataFrame 사이의 공통되지 않은 행 찾기 – concat()과 drop_duplicates() 활용법

두 개의 DataFrame을 비교하다 보면 한쪽에만 존재하는 행, 즉 공통되지 않은(uncommon) 행을 찾아야 할 때가 있습니다. Pandas에서는 concat() 메서드와 drop_duplicates()를 조합하면 이 작업을 아주 간단하게 처리할 수 있습니다.

핵심 원리

방법은 크게 두 단계로 이루어집니다.

  1. pd.concat()으로 두 DataFrame을 위아래로 하나로 합칩니다.
  2. 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 간의 차이를 찾는 가장 간단하고 직관적인 방법입니다. 집합 연산과 유사하게 동작하기 때문에 데이터 검증, 변경 사항 비교, 이상치 탐지 등 다양한 상황에서 유용하게 활용할 수 있습니다.