이번 포스팅에서는 판다스(Pandas)를 활용해 데이터를 그룹화하여 분석하고, 여러 데이터를 합치며, 머신러닝을 위해 데이터를 전처리하는 과정(원-핫 인코딩 등)에 대해 정리해보겠습니다.
Pandas
1. 데이터 그룹화 (GroupBy)
데이터를 특정 기준에 따라 나누고, 그룹별로 집계(평균, 합계 등)를 낼 때 사용합니다.
- 기본 사용법: df.groupby('기준컬럼')
- 집계 함수: .count(), .mean(), .sum() 등을 뒤에 붙여 사용합니다.
- numeric_only=True: 수치형 데이터만 계산하도록 설정 (오류 방지)
# 'group' 컬럼을 기준으로 묶어서 평균 구하기
df.groupby('group').mean(numeric_only=True)
# 'group' 컬럼 기준 합계 구하기
df.groupby('group').sum(numeric_only=True)
다중 그룹화 (2차 그룹) 여러 기준을 적용할 때는 리스트 []를 사용합니다.
# 혈액형(blood)과 성별(gender)로 묶은 뒤 키(height)의 평균 구하기
df.groupby(['blood', 'gender'])['height'].mean()
2. 중복값 처리
데이터에서 중복된 요소를 확인하거나 제거할 때 사용합니다.
- 중복 제거: drop_duplicates()
- keep='first': (기본값) 첫 번째 값만 남김
- keep='last': 마지막에 나온 값을 남김
- 값의 빈도수 확인: value_counts()
- 가장 많이 등장하는 값부터 내림차순으로 정렬됩니다.
- dropna=False: 결측치(NaN)도 포함하여 개수를 셀 때 사용합니다.
# 중복 제거 (마지막 값 유지)
df['blood'].drop_duplicates(keep='last')
# 값의 개수 세기 (NaN 포함)
df['blood'].value_counts(dropna=False)
3. 데이터프레임 합치기 (Concat & Merge)
데이터를 합치는 방법은 크게 물리적으로 이어 붙이는 방식(Concat)과 특정 키를 기준으로 병합하는 방식(Merge)이 있습니다.
① concat() : 물리적 결합
단순히 데이터를 위아래(행) 또는 양옆(열)으로 붙일 때 사용합니다.
- axis=0: 위아래로 연결 (행 추가, 기본값)
- axis=1: 옆으로 연결 (열 추가)
- ignore_index=True: 기존 인덱스를 무시하고 새로 인덱스를 부여
- 주의: axis=1 사용 시 인덱스(Row Number)가 서로 다르면 엉뚱한 위치에 붙거나 NaN이 발생할 수 있으므로 reset_index(drop=True)로 인덱스를 정리한 후 합치는 것이 좋습니다.
# 행으로 합치기 (인덱스 초기화)
pd.concat([df1, df2], ignore_index=True)
# 열로 합치기
pd.concat([df1, df2], axis=1)
② merge() : 관계형 결합 (SQL Join과 유사)
공통된 컬럼(Key)을 기준으로 데이터를 병합합니다.
- on: 기준이 되는 컬럼명
- how: 병합 방식 (left, right, inner, cross)
- inner: 교집합 (양쪽 모두에 있는 데이터만)
- left/right: 특정 데이터프레임을 기준으로 보존
# '이름'을 기준으로 내부 조인 (공통된 데이터만)
pd.merge(df1, df2, on='이름', how='inner')
# 컬럼명이 다를 경우 (df1은 '이름', df2는 '성함')
pd.merge(df1, df2, left_on='이름', right_on='성함', how='inner')
4. 순위 매기기 (Rank)
데이터의 순위를 매길 때 사용합니다.
- ascending=False: 높은 값이 1등 (내림차순)
- astype(int): 순위를 정수형으로 깔끔하게 변환
# 브랜드평판지수가 높은 순서대로 순위 매기기
df['브랜드순위'] = df['브랜드평판지수'].rank(ascending=False).astype(int)
5. 날짜 데이터 다루기
문자열로 되어 있는 날짜 데이터를 datetime 객체로 변환하면 년, 월, 일 등을 쉽게 추출할 수 있습니다.
- 변환: pd.to_datetime(컬럼)
- 접근자: .dt를 사용하여 세부 정보 추출 (year, month, day, dayofweek 등)
# 변환
df['birthday'] = pd.to_datetime(df['birthday'])
# 정보 추출
print(df['birthday'].dt.year) # 연도
print(df['birthday'].dt.dayofweek) # 요일 (0:월 ~ 6:일)
print(df['birthday'].dt.isocalendar().week) # 몇 번째 주인지 확인
6. 함수 적용 (Apply & Map)
데이터를 변환하거나 사용자 정의 함수를 적용할 때 사용합니다.
① apply()
데이터프레임이나 시리즈의 행/열 단위로 함수를 적용합니다. 복잡한 로직이나 lambda 함수와 함께 자주 사용됩니다.
# 성별을 숫자로 변환하는 람다 함수 적용
df['gender'] = df['gender'].apply(lambda x: 1 if x == '남자' else 0)
② map()
Series(1차원)에서 주로 사용하며, 딕셔너리를 이용해 값을 1:1로 매핑할 때 편리합니다.
map_gender = {'남자': 1, '여자': 0}
df['gender'] = df['gender'].map(map_gender)
7. 데이터 산술 연산 및 타입 선택
- 산술 연산: 시리즈(컬럼)끼리 사칙연산이 가능합니다. 단, 타입이 맞지 않거나 데이터 개수가 다르면 NaN이 발생할 수 있습니다.
- select_dtypes: 특정 데이터 타입만 골라낼 때 유용합니다.
# 숫자형 데이터(문자열 제외)만 선택하여 10 더하기
df.select_dtypes(exclude='object') + 10
# 문자열(object) 컬럼 이름만 가져오기
str_cols = df.select_dtypes(include='object').columns
8. ⭐범주형 데이터 전처리 (One-Hot Encoding)
컴퓨터(머신러닝 모델)는 '남자/여자', 'A형/B형' 같은 글자를 이해하지 못합니다. 이를 숫자로 바꿔주는 과정이 필요합니다.

범주형 데이터 판단 기준
- 순서가 없는 명목형: 혈액형, 지역, 성별 (→ 원-핫 인코딩 추천)
- 순서가 있는 범주형: 등급(A/B/C), 만족도 (→ 라벨 인코딩 고려)
- 고유값이 너무 많은 경우: 주민번호, ID 등 (→ 삭제 고려)
원-핫 인코딩 (One-Hot Encoding)
각 범주를 별도의 컬럼으로 만들고, 해당되는 값에만 1, 나머지는 0을 채우는 방식입니다. 판다스의 get_dummies()를 사용합니다.
# 'blood' 컬럼을 원-핫 인코딩으로 변환
df = pd.get_dummies(df, columns=['blood'])
# 결과 예시: blood_A, blood_B, blood_O 등의 컬럼이 생성되고 0 또는 1이 채워짐
'개념 정리 step1 > 데이터 분석' 카테고리의 다른 글
| [데이터 분석] 저가 커피 프랜차이즈는 정말 스타벅스 옆에 입점할까? (feat. Haversine) (0) | 2025.12.10 |
|---|---|
| [Python] Matplotlib 정리 & 데이터 분석 (Online Retail) (0) | 2025.12.09 |
| [Python] Selenium을 활용한 웹 크롤링 (0) | 2025.12.05 |
| [Python] 웹 크롤링 개념 정리와 데이터 수집 해보기 (0) | 2025.12.04 |
| [Python] 데이터 분석의 기초 Numpy, Pandas(1) (0) | 2025.12.03 |