파이썬 - Pandas를 활용한 조인

hyun-jin·2025년 3월 13일

데이터 분석

목록 보기
19/100
post-thumbnail

데이터 분석 17일차

1. merge() - SQL 스타일 조인

🔹 merge()는 SQL의 JOIN과 유사하게 동작하며, 공통 컬럼을 기준으로 DataFrame을 결합할 때 사용한다.

✅ 기본 문법

pd.merge(df1, df2, on='공통 컬럼', how='조인 방식')

✅ 조인 방식 (how 옵션)

  • inner (기본값): 공통 컬럼 값이 있는 데이터만 반환 (교집합)
  • left: 왼쪽(df1) 데이터는 모두 포함, 오른쪽(df2) 데이터는 매칭되는 것만 포함
  • right: 오른쪽(df2) 데이터는 모두 포함, 왼쪽(df1) 데이터는 매칭되는 것만 포함
  • outer: 양쪽 데이터 모두 포함 (합집합, NaN 채워짐)

✅ 예제

import pandas as pd
#
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Score': [85, 90, 78]})
#
# Inner Join (교집합)
merged_df = pd.merge(df1, df2, on='ID', how='inner')
print(merged_df)

🔹 출력 결과

   ID  Name  Score
0   2   Bob     85
1   3  Charlie  90
# ✅ ID=1(df1에만)과 ID=4(df2에만)는 제외됨 (공통 데이터만 유지).

1) 컬럼명이 다를때

pd.merge(df1, df2, how='조인 방식', left_on='왼쪽 테이블 컬럼명',righr_on='오른쪽 테이블 컬럼명')

import pandas as pd
#
# 예제 데이터 생성
df1 = pd.DataFrame({'Emp_ID': [101, 102, 103], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [102, 103, 104], 'Score': [85, 90, 78]})
#
# 컬럼명이 다른 경우 `left_on`, `right_on` 사용
merged_df = pd.merge(df1, df2, how='inner', left_on='Emp_ID', right_on='ID')
#
print(merged_df)

🔹출력 결과

   Emp_ID    Name   ID  Score
0    102     Bob  102     85
1    103  Charlie  103     90
# ✅ Emp_ID와 ID를 기준으로 조인되었으며, 중복되는 ID 컬럼이 그대로 유지됨.

2) 중복 컬럼 구분 (suffixes=('_left', '_right'))

🔹 ID처럼 두 데이터프레임에 공통 컬럼이 있을 때, 컬럼명이 충돌하는 경우 자동으로 _x, _y가 붙음
🔹 이를 명확하게 표시하려면 suffixes=('_left', '_right')을 설정할 수 있음.
pd.merge(df1, df2, how='조인 방식', left_on='왼쪽 테이블 컬럼명',righr_on='오른쪽 테이블 컬럼명', suffixe=('_left', '_right'))

# suffixes 추가
merged_df = pd.merge(df1, df2, left_on='Emp_ID', right_on='ID', how='inner', suffixes=('_left', '_right'))
print(merged_df)

🔹출력 결과

   Emp_ID_left    Name  ID_right  Score
0        102     Bob       102     85
1        103  Charlie       103     90

✅ Emp_ID → Emp_ID_left, ID → ID_right로 변경되어 컬럼명이 충돌하지 않도록 구분됨.

3) 공통컬럼이 2개 이상일 때 (on=['컬럼1', '컬럼2'])

pd.merge(df1, df2, how='조인 방식', on=['컬럼1', '컬럼2'])

import pandas as pd
#
# 예제 데이터 생성
df1 = pd.DataFrame({'Dept': ['HR', 'IT', 'Finance'], 
                    'Emp_ID': [101, 102, 103], 
                    'Name': ['Alice', 'Bob', 'Charlie']})
#
df2 = pd.DataFrame({'Dept': ['HR', 'IT', 'Finance'], 
                    'Emp_ID': [102, 103, 104], 
                    'Salary': [5000, 7000, 6000]})
#
# 공통 컬럼이 'Dept'와 'Emp_ID' 두 개일 경우
merged_df = pd.merge(df1, df2, on=['Dept', 'Emp_ID'], how='inner')
#
print(merged_df)

🔹출력 결과

    Dept  Emp_ID    Name  Salary
0     IT     102     Bob    5000
1  Finance     103  Charlie    7000

✅ 공통 컬럼인 Dept와 Emp_ID가 일치하는 행만 조인됨

4) 공통컬럼이지만 컬럼명이 다를 때 (left_on, right_on)

df1 = pd.DataFrame({'Department': ['HR', 'IT', 'Finance'], 
                    'Employee_ID': [101, 102, 103], 
                    'Name': ['Alice', 'Bob', 'Charlie']})
#
df2 = pd.DataFrame({'Dept': ['HR', 'IT', 'Finance'], 
                    'Emp_ID': [102, 103, 104], 
                    'Salary': [5000, 7000, 6000]})
#
# 컬럼명이 다를 경우 `left_on`과 `right_on` 사용
merged_df = pd.merge(df1, df2, 
                     left_on=['Department', 'Employee_ID'], 
                     right_on=['Dept', 'Emp_ID'], 
                     how='inner')
#
print(merged_df)

🔹 출력 결과

  Department  Employee_ID    Name    Dept  Emp_ID  Salary
0        IT         102     Bob      IT     102    5000
1   Finance         103  Charlie  Finance     103    7000

✅ 컬럼명이 달라도 left_on=['컬럼1', '컬럼2']과 right_on=['컬럼3', '컬럼4']을 사용하여 조인 가능
✅ Department-Dept, Employee_ID-Emp_ID를 기준으로 조인됨
✅ Emp_ID=101과 Emp_ID=104는 제외됨


2. join() - 인덱스를 기준으로 결합

🔹 join()은 기본적으로 DataFrame의 인덱스를 기준으로 조인을 수행한다.

📌 pandas join() 주요 옵션 정리

옵션설명예제
how조인 방식 (inner, outer, left, right)df1.join(df2, how='left')
lsuffix / rsuffix공통 컬럼이 있을 경우 접미사 추가df1.join(df2, lsuffix='_left', rsuffix='_right')
sort조인 후 인덱스를 정렬할지 여부 (True/False)df1.join(df2, sort=True)

join() 옵션 설명

  • how → 어떤 방식으로 조인할지 결정 (left, right, inner, outer)
  • lsuffix / rsuffix → 공통 컬럼이 존재할 경우 _left, _right 등의 접미사 추가 가능
  • sortTrue 설정 시, 조인 후 인덱스를 정렬

✅ 기본 문법

df1.join(df2, how='조인 방식')

✅ 예제

df1 = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie']}, index=[1, 2, 3])
df2 = pd.DataFrame({'Score': [85, 90, 78]}, index=[2, 3, 4])
#
# Left Join (df1 기준)
joined_df = df1.join(df2, how='left')
print(joined_df)

🔹 출력 결과

       Name  Score
1    Alice    NaN
2      Bob   85.0
3  Charlie   90.0

✅ join()은 index를 기준으로 조인되며, ID=1의 Score는 없으므로 NaN 처리됨.


3. Concat() - 행(axis=0) 또는 열(axis=1) 방향으로 결합

🔹 concat()은 행(axis=0) 또는 열(axis=1) 기준으로 데이터를 단순 병합한다.
🔹 다른 조인 방식(merge, join)과 달리 단순히 데이터프레임을 이어붙이는 역할

📌 pandas concat() 주요 옵션

옵션설명예제
axis결합 방향 설정 (0: 수직 결합, 1: 수평 결합)pd.concat([df1, df2], axis=0)
join조인 방식 선택 (inner, outer)pd.concat([df1, df2], join='outer')
join_axes조인할 축을 지정 (Deprecatedreindex() 사용)df1.reindex(df2.columns, axis=1)
keys데이터프레임에 계층적 인덱스 부여pd.concat([df1, df2], keys=['A', 'B'])
ignore_index인덱스 재설정 (True 설정 시 기존 인덱스 무시)pd.concat([df1, df2], ignore_index=True)

📌 문법

# 기본 작성구문
pd.concat([df2, df3])
#
# 세로로 결합
pd.concat([df2, df3], axis=0, ignore_index=True, join='inner')
#
# 가로로 결합
pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')

4. append()

  • 데이터프레임에 행을 추가하는 메서드로, 두 데이터프레임을 행 기준으로 결함하는 함수
  • 하지만 곧 사라질 예정...

df.append(df2)


pandas를 활용한 join방법을 배웠다. 계속 쓰다 보면 익숙해 지겠지?!

0개의 댓글