[판다스] 🚨1타 2피! concat & merge로 데이터 병합 마스터하기 (SQL JOIN 개념까지)
판다스 데이터 프레임, 이제 마스터할 시간! (컨캣 & 머지)
이번 시간까지만 집중하면 판다스로 데이터 프레임을 다루는 건 거의 끝이야! 오늘은 여러 데이터 프레임을 합치는 컨캣(concat)이랑 머지(merge)에 대해 알아볼 건데, 이건 마치 SQL의 '조인'이랑 비슷한 개념이라고 생각하면 돼.
1. 컨캣 (concat): 그냥 쭉쭉 붙여보자!
컨캣은 데이터 프레임을 세로(행)나 가로(열) 방향으로 그냥 쭉 붙일 때 써.
예시 데이터 만들기:
import pandas as pd
# 학생 1 정보
student1 = pd.DataFrame({'학번': [101, 102, 103],
'이름': ['철수', '영희', '민수']})
# 학생 2 정보
student2 = pd.DataFrame({'학번': [104, 105],
'이름': ['지혜', '준호']})
# 점수 정보
score = pd.DataFrame({'학번': [101, 102, 103, 104, 105],
'국어': [80, 90, 70, 85, 95],
'영어': [75, 85, 80, 90, 70],
'수학': [90, 75, 85, 80, 90]})
print("student1:\n", student1)
print("\nstudent2:\n", student2)
print("\nscore:\n", score)
세로로 붙이기 (행 방향):
student1이랑 student2를 세로로 합치고 싶으면 pd.concat()을 쓰면 돼.
student_all = pd.concat([student1, student2])
print("\n세로로 합친 student_all:\n", student_all)
주의! 인덱스 꼬임 방지:
이렇게 그냥 붙이면 인덱스가 겹칠 수 있어. 이걸 방지하려면 ignore_index=True 옵션을 써주면 돼.
student_all_reset = pd.concat([student1, student2], ignore_index=True)
print("\n인덱스 초기화 후 세로로 합친 student_all_reset:\n", student_all_reset)
가로로 붙이기 (열 방향):
이제 student_all_reset에 score 정보를 가로로 붙여보자. 이때는 axis=1 옵션을 써야 해.
# 가로로 붙이기 전에 인덱스를 맞춰주는 게 좋아
student_all_reset = student_all_reset.reset_index(drop=True)
score = score.reset_index(drop=True)
# 가로로 붙이기
merged_data_col = pd.concat([student_all_reset, score], axis=1)
print("\n가로로 합친 merged_data_col:\n", merged_data_col)
axis=0(기본값): 세로로 붙여 (행 추가)axis=1: 가로로 붙여 (열 추가)
2. 머지 (merge): 키를 맞춰서 똑똑하게 합치자!
머지는 SQL의 '조인'처럼, 공통된 컬럼(키)을 기준으로 데이터 프레임을 합칠 때 써. 마치 두 개의 명부를 보고 같은 사람끼리 정보를 합치는 거라고 생각하면 돼.
머지의 다양한 방식 (조인 방식):
머지할 때는 어떤 기준으로 합칠지 정할 수 있어.
inner(교집합): 두 데이터 프레임에 모두 있는 키만 합쳐.outer(합집합): 두 데이터 프레임에 있는 모든 키를 합쳐. 없는 건NaN으로 표시돼.left(왼쪽 기준): 왼쪽 데이터 프레임의 모든 키를 기준으로 합치고, 오른쪽에서 일치하는 것만 가져와.right(오른쪽 기준): 오른쪽 데이터 프레임의 모든 키를 기준으로 합치고, 왼쪽에서 일치하는 것만 가져와.
예시: student_all_reset과 score를 '학번'을 기준으로 합쳐보자.
# 기본적으로 inner 조인으로 합쳐짐
merged_inner = pd.merge(student_all_reset, score, on='학번', how='inner')
print("\n머지 (inner 조인):\n", merged_inner)
# 모든 데이터를 합치기 (outer 조인)
merged_outer = pd.merge(student_all_reset, score, on='학번', how='outer')
print("\n머지 (outer 조인):\n", merged_outer)
# 왼쪽 기준 (student_all_reset 기준)
merged_left = pd.merge(student_all_reset, score, on='학번', how='left')
print("\n머지 (left 조인):\n", merged_left)
# 오른쪽 기준 (score 기준)
merged_right = pd.merge(student_all_reset, score, on='학번', how='right')
print("\n머지 (right 조인):\n", merged_right)
컬럼 이름이 다를 때:
만약 합치려는 컬럼 이름이 다르면, left_on이랑 right_on 옵션을 써서 각각 지정해줘야 해.
# 컬럼 이름이 다른 예시 데이터 생성
student_address = pd.DataFrame({'student_id': [101, 102, 103, 106, 107],
'주소': ['서울', '부산', '대구', '인천', '광주']})
# '학번'과 'student_id'를 기준으로 left 조인
merged_diff_col = pd.merge(student_all_reset, student_address, left_on='학번', right_on='student_id', how='left')
print("\n컬럼 이름이 다를 때 머지 (left 조인):\n", merged_diff_col)
3. 병합 후 정리하기
데이터를 합친 후에는 필요한 정보만 뽑거나, 정렬하는 과정이 필요할 수 있어.
필요한 컬럼만 선택하고 평균 계산하기:
# 필요한 컬럼만 선택
selected_cols = merged_data_col[['이름', '국어', '영어', '수학']]
# 평균 계산
selected_cols['평균'] = selected_cols[['국어', '영어', '수학']].mean(axis=1)
print("\n평균 계산:\n", selected_cols)
정렬하기:
평균을 기준으로 내림차순으로 정렬해볼까? sort_values()를 쓰면 돼.
# 평균을 기준으로 내림차순 정렬
sorted_data = selected_cols.sort_values(by='평균', ascending=False)
print("\n평균 기준으로 내림차순 정렬:\n", sorted_data)
요약!
- 컨캣 (concat): 그냥 세로 또는 가로로 쭉쭉 붙일 때!
- 세로:
pd.concat([df1, df2]) - 가로:
pd.concat([df1, df2], axis=1) - 인덱스 꼬임 방지:
ignore_index=True
- 세로:
- 머지 (merge): 공통된 키를 기준으로 똑똑하게 합칠 때! (SQL 조인처럼)
pd.merge(df1, df2, on='기준컬럼', how='조인방식')- 조인 방식:
inner,outer,left,right - 컬럼 이름 다를 때:
left_on='df1컬럼', right_on='df2컬럼'
컨캣이랑 머지는 정말 많이 쓰이니까, 꼭 직접 코드를 짜보고 연습해보는 게 중요해! 이걸로 판다스 데이터 프레임 다루는 건 거의 끝났다고 보면 돼! 수고했어!