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

Python Pandas – concat() 함수로 두 DataFrame의 공통 행 찾는 방법

두 개의 DataFrame에서 공통 행을 추출하려면 Pandas의 concat() 함수를 활용할 수 있습니다. 이 방법은 두 데이터프레임을 하나로 합친 후, 각 행이 몇 번 나타나는지 세어 2번 이상 등장하는 행(즉, 양쪽에 모두 존재하는 행)을 찾아내는 원리로 동작합니다.

1단계: 첫 번째 DataFrame 생성

먼저 두 개의 컬럼을 가진 첫 번째 DataFrame을 만들어 보겠습니다.

dataFrame1 = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
        "Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
    }
)

2단계: 두 번째 DataFrame 생성

같은 구조를 가진 두 번째 DataFrame을 생성합니다.

dataFrame2 = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
        "Reg_Price": [1200, 1500, 1000, 800, 1100, 1000]
    }
)

3단계: concat()으로 두 DataFrame 병합

concat() 함수를 사용해 두 DataFrame을 하나로 합칩니다.

dfRes = pd.concat([dataFrame1, dataFrame2])

4단계: 인덱스 초기화

병합된 결과의 인덱스를 재설정합니다.

dfRes = dfRes.reset_index(drop=True)

5단계: groupby()로 행 그룹화

모든 컬럼을 기준으로 groupby()를 수행합니다.

dfGroup = dfRes.groupby(list(dfRes.columns))

6단계: 공통 행 필터링

각 그룹의 길이를 계산하여 개수를 구합니다. 개수가 1보다 크다면 두 DataFrame 모두에 존재하는 공통 행을 의미합니다.

res = [k[0] for k in dfGroup.groups.values() if len(k) > 1]

전체 예제 코드

지금까지 설명한 내용을 하나의 코드로 정리하면 다음과 같습니다.

import pandas as pd

# DataFrame1 생성
dataFrame1 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1000, 1500, 1100, 800, 1100, 900] }
)

print("DataFrame1 ...\n", dataFrame1)

# DataFrame2 생성
dataFrame2 = pd.DataFrame(
{
"Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
"Reg_Price": [1200, 1500, 1000, 800, 1100, 1000]
}
)

print("\nDataFrame2 ...\n", dataFrame2)

# 두 DataFrame 사이의 공통 행 찾기
dfRes = pd.concat([dataFrame1, dataFrame2])

# 인덱스 초기화
dfRes = dfRes.reset_index(drop=True)

# 컬럼 기준 그룹화
dfGroup = dfRes.groupby(list(dfRes.columns))

# 각 행의 길이를 계산해 개수 확인
# 개수가 1보다 크면 공통 행
def find_common_rows(df):
    grouped = df.groupby(list(df.columns)).groups.values()
    return [k[0] for k in grouped if len(k) > 1]

res = [k[0] for k in dfGroup.groups.values() if len(k) > 1]

print("\n공통 행...\n", dfRes.reindex(res))

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

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        1200
1      Lexus        1500
2       Audi        1000
3      Tesla         800
4    Bentley        1100
5     Jaguar        1000

공통 행...
        Car   Reg_Price
3      Tesla         800
1      Lexus        1500
4    Bentley        1100

결과 해석

출력 결과를 보면 Tesla(800), Lexus(1500), Bentley(1100) 세 개의 행이 두 DataFrame 모두에 동일하게 존재함을 알 수 있습니다. BMW와 Jaguar는 등록 가격이 서로 달라 공통 행에서 제외되었고, Audi 역시 가격 차이 때문에 포함되지 않았습니다.

참고: merge()를 사용한 대안 방법

concat() 외에도 merge() 함수를 사용하면 더 직관적으로 공통 행을 찾을 수 있습니다.

common_rows = pd.merge(dataFrame1, dataFrame2, how='inner')
print(common_rows)

내부 조인(inner join) 방식으로 두 DataFrame에 모두 존재하는 행만 깔끔하게 반환되므로, 실무에서는 상황에 따라 더 편리한 방법을 선택하면 됩니다.