02단계 · 표 다루기 (pandas)
표 두 개 합치기
`pd.merge` 의 `how` 에 따라 행 수가 어떻게 달라지는지 직접 확인한다.
먼저 알아볼게요
코드로 이동 ↓pd.merge(왼쪽, 오른쪽, on="공통열") 은 공통 열의 값이 같은 행끼리 옆으로 붙인다. 엑셀의 VLOOKUP 과 같은 일이다.
how="inner"(기본)는 양쪽에 다 있는 값만 남긴다. how="left" 는 왼쪽 표를 전부 남기고 짝이 없으면 NaN 을 채운다. how="outer" 는 양쪽을 다 남긴다.
dept.csv 의 물류 부서에는 직원이 하나도 없다. 그래서 inner 와 left 는 30행이지만 outer 는 31행이 된다 — 짝 없는 물류 한 줄이 더 붙기 때문이다.
병합 후에는 행 수를 반드시 확인한다. 공통 열에 중복이 있으면 행이 오히려 늘어난다. 늘어난 것을 모르고 평균을 내면 답이 틀린다.
how 를 잘못 고르는 것은 조용한 오답이다. 오류가 나지 않고 값만 달라지기 때문에, 행 수와 조인 키의 중복, 결합되지 않은 값을 함께 확인한다.
이렇게 써요
import pandas as pd
emp = pd.read_csv("emp.csv")
dept = pd.read_csv("dept.csv")
print(pd.merge(emp, dept, on="부서").columns.tolist())
print(pd.merge(emp, dept, on="부서").head(2)[["이름", "부서", "지역"]])기억할 한 가지
병합 뒤에는 행 수를 확인한다. how 를 잘못 골라도 오류는 나지 않고 답만 달라진다.
직접 해보기
emp.csv 와 dept.csv 를 부서 로 합쳐 ① inner·left·outer 의 행 수를 한 줄에 ② inner 결과의 지역별 연봉 평균(소수 2) ③ outer 결과에서 이름 이 비어 있는 행의 부서 목록을 출력하세요.
제공 파일 2개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
emp.csv
사번,이름,부서,직급,연봉,근속연수,고객만족도,입사일 1001,김서준,인사,사원,3230,2,3.8,2024-08-28 1002,이지우,인사,사원,4083,3,4.2,2023-07-26 1003,박도윤,인사,사원,3222,1,3.4,2025-09-24 1004,최하은,지원,부장,7395,18,4.6,2008-06-09 1005,정예준,영업,부장,8075,17,,2009-05-20 1006,강수아,인사,부장,7466,18,4.7,2008-06-01 1007,조민준,지원,대리,4558,5,4.7,2021-01-28 1008,윤지아,영업,과장,5796,,4.6,2015-04-13 1009,장시우,지원,과장,5878,13,4.6,2013-12-15 1010,임하윤,지원,대리,4686,9,3.3,2017-05-19 1011,한도현,지원,부장,7426,20,4.3,2006-07-27 1012,오채원,영업,사원,3545,4,,2022-06-25 1013,신건우,영업,사원,3724,1,3.8,2025-02-19 1014,권서연,영업,대리,4327,7,3.2,2019-05-06 1015,황준서,개발,부장,7732,21,4.7,2005-05-13 1016,안다은,영업,사원,3823,4,4.2,2022-01-13 1017,송지호,개발,부장,7262,19,4.4,2007-07-27 1018,전유진,지원,과장,6006,15,3.6,2011-03-16 1019,홍현우,개발,과장,5806,14,4.7,2012-10-17 1020,문소율,지원,사원,4008,,3.2,2023-01-06 1021,양지훈,개발,부장,7754,13,3.4,2013-07-10 1022,배가은,개발,과장,5483,13,3.4,2013-03-21 1023,백태윤,지원,사원,3510,4,4.1,2022-10-07 1024,유서윤,인사,사원,3477,2,,2024-06-22 1025,남주원,지원,사원,3581,1,3.3,2025-06-12 1026,노예린,영업,대리,4410,4,4.9,2022-06-04 1027,하시윤,지원,부장,7820,21,3.6,2005-04-15 1028,구다인,인사,사원,3846,1,3.2,2025-11-08 1029,서준혁,인사,대리,4549,4,3.2,2022-06-24 1030,민하율,개발,부장,7903,15,3.2,2011-12-03
dept.csv
부서,지역,정원 영업,서울,12 인사,서울,6 개발,판교,15 지원,대전,8 물류,부산,9
내 코드 Python
Python 준비 중… 처음 한 번만 내려받아요
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
emp = pd.read_csv("emp.csv")
dept = pd.read_csv("dept.csv")
inner = pd.merge(emp, dept, on="부서")
left = pd.merge(emp, dept, on="부서", how="left")
outer = pd.merge(emp, dept, on="부서", how="outer")
print(inner.shape[0], left.shape[0], outer.shape[0])
print(inner.groupby("지역")["연봉"].mean().round(2))
print(outer[outer["이름"].isna()]["부서"].tolist())