Data Analysis

데이터 병합 (merge / join / concat(단순 붙이기))

김심슨 2025. 5. 27. 19:52

두 개 이상의 테이블(데이터프레임)을 공통 컬럼 기준으로 결합 

 

1. 기본 예제 : 두 개의 데이터 프레임 생성 

import pandas as pd

# 고객 정보
df_customers = pd.DataFrame({
    'id': [101, 102, 103],
    'name': ['홍길동', '강감찬', '이순신']
})

# 주문 정보
df_orders = pd.DataFrame({
    'id': [101, 102, 104],
    'item': ['노트북', '모니터', '키보드']
})

 

2. 기본 merge (inner join : 공통 key만)

df_merge = pd.merge(df_customers, df_orders, on='id')

- on='id' -> 공통 컬럼 기준으로 병합 

inner join 양쪽에 모두 존재하는 id만 병합됨 

 

3. 병합 기준 컬럼명이 다를 때 (left_on, right_on)

# 예 : df_orders에서 'user_id'라는 다른 이름을 썼을 경우 
df_orders_renamed = df_orders.rename(columns = {'id' : 'user_id'}) # 컬럼명 바꿔보기

pd.merge(df_customers, df_orders_renamed, left_on = 'id', right_on = 'user_id')

4. 다중 기준 병합 (on=['id, 'date'] 등도 가능)

- 여러 컬럼을 기준으로 정확하게 일치하는 행만 병합

 

+) 왜? 

단일 기준만 사용하면 중복 매칭 문제가 생김 

pd.merge(df1, df2, on='customer_id')

단일 기준 병합을 하게 되면 2 x 2 = 4개가 매칭됨 (원래 1:1 인데 2:2가 되어버림)

 

- 실전 꿀팁 : 다중 기준 병합 + 병합 방식 명시

pd.merge(df1, df2, on = ['customer_id' 'order_date'], how = 'left')

customer_id와 order_date가 모두 일치하면 병합하고, 왼쪽 df1의 모든 행 유지 

 

- 실전 꿀팁 : 병합 컬럼 이름이 다른 경우 

pd.merge(df1, df2, left_on=['id1', 'date1'], right_on=['id2', 'date2'])

 

* 실무 활용 예시 


데이터 결합 : concat

여러 개의 데이터를 위아래 또는 좌우로 단순히 "붙이기"

 

1. 위, 아래로 붙이기 (행 추가 = axis=0)

import pandas as pd

df1 = pd.DataFrame({'id': [1, 2], 'name': ['홍길동', '강감찬']})
df2 = pd.DataFrame({'id': [3, 4], 'name': ['이순신', '유관순']})

df_concat = pd.concat([df1, df2], axis=0)
print(df_concat)

출력 결과

0 1 홍길동
1 2 강감찬
0 3 이순신
1 4 유관순

=> 인덱스가 그대로 유지됨, 필요 시 ignore_index = True 옵션 추가 

pd.concat([df1, df2], axis=0, ignore_index=True)

 

 

인덱스 새롭게 만들어짐

0 1 홍길동
1 2 강감찬
2 3 이순신
3 4 유관순

 

2. 옆으로 붙이기 (열 추가 = axis=1)

- 행 수가 같아야 자연스럽게 붙음, 행 수가 다르면 NaN 생김

df3 = pd.DataFrame({'age': [20, 30]})
df4 = pd.DataFrame({'score': [100, 90]})

pd.concat([df3, df4], axis=1)