그룹핑 · 재구조화 · 결합

교재 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)
백금
반지5000200
목걸이08000

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

df.groupby('month').mean(numeric_only=True) 에서 numeric_only=True 의 역할은?


🔗 다음 학습