그룹핑 · 재구조화 · 결합
교재 6.15 ~ 6.19 절. Split-Apply-Combine 패턴의 groupby(), 논리 인덱싱 필터링, 테이블 변형 pivot · pivot_table, 테이블 결합 concat · merge.
1. groupby() — 분할·적용·결합
데이터 분석의 핵심 패턴: 그룹으로 나눠(split) → 함수 적용(apply) → 다시 모으기(combine).
PYTHON
df['month'] = pd.DatetimeIndex(df['일시']).month
monthly_means = df.groupby('month').mean(numeric_only=True)numeric_only=True로 비수치형 열 제외- 이전 시대의
for루프를 대체 — 한 줄로 월별 평균 완성
1.1 다양한 집계
PYTHON
df.groupby('month').max()
df.groupby('month').min()
df.groupby('year')['평균기온'].mean()1.2 연도별 예시
PYTHON
df['year'] = pd.DatetimeIndex(df['일시']).year
yearly = df.groupby('year')[['평균기온', '최대풍속', '평균풍속']].mean()2. 논리 인덱싱으로 필터링
조건을 Boolean Series 로 만들어 데이터프레임에 마스크로 적용.
PYTHON
# 평균풍속이 4 이상인 달만
monthly_means[monthly_means['평균풍속'] >= 4.0]
# 여러 조건
df[(df['year'] == 2015) & (df['평균기온'] > 20)]&(and),|(or),~(not) 사용- 각 조건은 반드시 괄호로 감싸기
3. pivot() / pivot_table() — 구조 변경
3.1 pivot() — 긴(long) → 넓은(wide)
| 상품 | 재질 | 가격 |
|---|---|---|
| 반지 | 금 | 500 |
| 반지 | 은 | 200 |
| 목걸이 | 백금 | 800 |
PYTHON
df.pivot(index='상품', columns='재질', values='가격').fillna(0)| 금 | 백금 | 은 | |
|---|---|---|---|
| 반지 | 500 | 0 | 200 |
| 목걸이 | 0 | 800 | 0 |
3.2 pivot_table() — 중복 + 집계
pivot()은 인덱스·컬럼 조합이 유일해야 함 (중복이면 오류)- 중복이 있거나 인덱스/컬럼이 2개 이상이면
pivot_table()사용
PYTHON
df.pivot_table(index='상품', columns='재질', values='가격', aggfunc='mean')| 상황 | 선택 |
|---|---|
| 단순 재구조화, 중복 없음 | pivot() |
| 인덱스/컬럼 2개 이상, 또는 중복 집계 | pivot_table() |
4. concat() — 단순 결합
쌓기(stacking). 여러 DataFrame 을 행 또는 열 방향으로 이어 붙임.
PYTHON
pd.concat([df_1, df_2]) # axis=0 (행 방향, 기본)
pd.concat([df_1, df_2], axis=1) # axis=1 (열 방향)
pd.concat([df_1, df_2], join='inner') # 공통 열만 유지
pd.concat([df_1, df_2], join='outer') # 모든 열 유지 (기본)- 첫 인자는 DataFrame 리스트
axis=0: 행이 늘어남 (위아래로 붙임)axis=1: 열이 늘어남 (좌우로 붙임)
5. merge() — 키 기반 조인
조인(join). 공통 키를 기준으로 두 테이블을 합침. SQL 의 JOIN 과 거의 동일.
PYTHON
df1.merge(df2, on='B', how='inner')5.1 how 4가지
how | 결과 |
|---|---|
'inner' | 양쪽 모두 존재하는 키만 (교집합) |
'outer' | 모든 키 (합집합), 없는 쪽은 NaN |
'left' | 왼쪽 DataFrame 키 전체 유지 |
'right' | 오른쪽 DataFrame 키 전체 유지 |
5.2 동명 열은 _x, _y 접미사
양쪽에 같은 이름의 열이 있고 키가 아닐 때, 자동으로 C_x · C_y 로 분리됩니다.
5.3 인덱스를 키로
PYTHON
df1.merge(df2, left_index=True, right_index=True, how='outer')6. concat vs merge 언제 무엇을?
| 상황 | 도구 |
|---|---|
| 같은 스키마의 여러 테이블을 위아래로 쌓기 | pd.concat(axis=0) |
| 열을 나란히 좌우로 붙이기 (인덱스 정렬 기준) | pd.concat(axis=1) |
| 두 테이블을 공통 키 기준으로 조인 | df.merge(..., on='key') |
📝 Checkpoint
Quiz
그룹핑 · 재구조화 Checkpoint
Q 1 / 4