데이터 분석 17일차
🔹 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에만)는 제외됨 (공통 데이터만 유지).
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 컬럼이 그대로 유지됨.
🔹 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로 변경되어 컬럼명이 충돌하지 않도록 구분됨.
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가 일치하는 행만 조인됨
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는 제외됨
🔹 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 등의 접미사 추가 가능sort → True 설정 시, 조인 후 인덱스를 정렬✅ 기본 문법
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 처리됨.
🔹 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 | 조인할 축을 지정 (Deprecated → reindex() 사용) | 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')
df.append(df2)