두 개의 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에 모두 존재하는 행만 깔끔하게 반환되므로, 실무에서는 상황에 따라 더 편리한 방법을 선택하면 됩니다.