Python Pandas에서 데이터프레임 피벗 (pivot) 하는 방법
- 그룹바이 (groupby): 데이터프레임을 특정 열 기준으로 그룹화하여 각 그룹별 집계 함수를 적용합니다.
- 피벗 (pivot): 그룹바이 결과를 행, 열, 값으로 구성된 새로운 데이터프레임으로 변환합니다.
예시
import pandas as pd
# 데이터프레임 생성
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Dave', 'Alice'],
'Age': [25, 30, 27, 31, 25],
'City': ['New York', 'London', 'Paris', 'Berlin', 'New York']})
# 그룹바이 및 평균 연령 계산
grouped = df.groupby('Name').mean()
# 피벗: 이름별 평균 연령 표
pivot_table = df.pivot_table(values='Age', index='Name', aggfunc='mean')
# 출력
print(grouped)
# 결과
# Age City
# Name
# Alice 25.0 New York
# Bob 30.0 London
# Carol 27.0 Paris
# Dave 31.0 Berlin
print(pivot_table)
# 결과
# Name Age
# Alice 25.0
# Bob 30.0
# Carol 27.0
# Dave 31.0
옵션
- values: 피벗 테이블에 표시될 값 열 지정
- index: 행 인덱스 지정
- columns: 열 인덱스 지정
- aggfunc: 집계 함수 지정 (예: sum, mean, count, std 등)
추가 예시
- 특정 도시별 이름, 나이 그룹별 평균 연령
pivot_table = df.pivot_table(values='Age', index='City', columns='Name', aggfunc='mean')
- 이름, 도시별 빈도
pivot_table = df.pivot_table(values='Name', index='City', columns='Name', aggfunc='count')
예제 코드
import pandas as pd
# 데이터프레임 생성
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Dave', 'Alice'],
'Age': [25, 30, 27, 31, 25],
'City': ['New York', 'London', 'Paris', 'Berlin', 'New York']})
# 1. 그룹바이 및 평균 연령 계산
grouped = df.groupby('Name').mean()
# 2. 피벗: 이름별 평균 연령 표
pivot_table = df.pivot_table(values='Age', index='Name', aggfunc='mean')
# 3. 특정 도시별 이름, 나이 그룹별 평균 연령
pivot_table_city_age = df.pivot_table(values='Age', index='City', columns='Name', aggfunc='mean')
# 4. 이름, 도시별 빈도
pivot_table_name_city_count = df.pivot_table(values='Name', index='City', columns='Name', aggfunc='count')
# 결과 출력
print(f"그룹바이 결과:\n{grouped}")
print(f"\n피벗 테이블: 이름별 평균 연령\n{pivot_table}")
print(f"\n피벗 테이블: 특정 도시별 이름, 나이 그룹별 평균 연령\n{pivot_table_city_age}")
print(f"\n피벗 테이블: 이름, 도시별 빈도\n{pivot_table_name_city_count}")
Pandas 데이터프레임 피벗 대체 방법
- 간단한 집계 작업에 유용
- 피벗 테이블보다 코드가 간결
# 이름별 평균 연령
df.groupby('Name')['Age'].mean()
# 특정 도시별 이름, 나이 그룹별 평균 연령
df.groupby(['City', 'Name'])['Age'].mean()
# 이름, 도시별 빈도
df.groupby(['City', 'Name']).size()
numpy.unique() & collections.Counter()
- 특정 열의 고유값 기준 집계
- 간단한 빈도 계산에 유용
import numpy as np
from collections import Counter
# 이름별 빈도
Counter(df['Name'])
# 도시별 이름 빈도
for city, names in df.groupby('City')['Name']:
print(f"{city}: {Counter(names)}")
람다 함수 & map()
- 동적 집계 함수 적용
- 다양한 집계 작업 가능
# 이름별 평균 연령 및 빈도
df.groupby('Name').agg(lambda x: (x.mean(), x.size()))
# 특정 도시별 이름별 평균 연령
df.groupby('City').apply(lambda x: x.groupby('Name')['Age'].mean())
직접 계산
- 간단한 데이터프레임 또는 특정 집계 작업에 유용
# 이름별 평균 연령
name_age_dict = {}
for name, group in df.groupby('Name'):
name_age_dict[name] = group['Age'].mean()
# 특정 도시별 이름, 나이 그룹별 평균 연령
city_name_age_dict = {}
for city, group in df.groupby('City'):
city_name_age_dict[city] = {}
for name, age in group[['Name', 'Age']].values:
city_name_age_dict[city][name] = age
선택 방법
- 데이터프레임 크기, 집계 작업 복잡도, 코드 간결성 고려
- 상황에 따라 적합한 방법 선택
python pandas group-by