두 개 이상의 테이블(데이터프레임)을 공통 컬럼 기준으로 결합
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)
'Data Analysis' 카테고리의 다른 글
데이터 정제 및 그래프 실습 (economics_anormaly.csv) (0) | 2025.05.29 |
---|---|
피벗과 피벗테이블 (0) | 2025.05.27 |
그룹별 통계 집계 (GroupBy & Aggregation) (0) | 2025.05.27 |
서브 플롯 subplot : 여러 개의 그래프를 하나의 창에 정리해서 보여줌 (0) | 2025.05.27 |
산점도 그래프 scatterplot (0) | 2025.05.26 |