Pandas 실전
Pandas는 Python 데이터 분석의 핵심 라이브러리입니다. DataFrame으로 표 형태 데이터를 효율적으로 처리합니다.
설치와 기본 구조
pip install pandas
import pandas as pd
import numpy as np
# Series — 1차원 레이블 배열
s = pd.Series([10, 20, 30, 40], index=["a", "b", "c", "d"])
print(s["b"]) # 20
print(s[s > 15]) # a:20, b:30, c:40
# DataFrame — 2차원 표 구조
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie", "Diana"],
"age": [28, 34, 22, 45],
"salary": [75000, 82000, 55000, 95000],
"department": ["Engineering", "Marketing", "Engineering", "HR"],
})
데이터 로딩
# CSV
df = pd.read_csv("data.csv", encoding="utf-8")
df = pd.read_csv("data.csv", sep="\t", parse_dates=["date"])
# Excel
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
# JSON
df = pd.read_json("data.json")
# DB (SQLAlchemy)
from sqlalchemy import create_engine
engine = create_engine("postgresql://user:pass@localhost/db")
df = pd.read_sql("SELECT * FROM products WHERE is_active = true", engine)
# 저장
df.to_csv("output.csv", index=False)
df.to_excel("output.xlsx", index=False)
기본 탐색
df.shape # (4, 4)
df.dtypes # 컬럼별 데이터 타입
df.info() # 비결측값 수, 메모리 사용량
df.describe() # 수치형 컬럼 통계 요약
df.head(3) # 상위 3행
df.tail(3) # 하위 3행
# 컬럼 선택
df["name"] # Series
df[["name", "salary"]] # DataFrame
# 행 선택
df.loc[0] # 인덱스 레이블로 선택
df.iloc[0] # 정수 위치로 선택
df.loc[df["age"] > 30] # 조건 필터링
df.iloc[1:3, 0:2] # 슬라이싱
데이터 정제
# 결측값 처리
df.isnull().sum() # 컬럼별 결측값 수
df.dropna() # 결측값 있는 행 삭제
df.dropna(subset=["salary"]) # 특정 컬럼만
df.fillna(0) # 0으로 채우기
df["salary"].fillna(df["salary"].mean(), inplace=True) # 평균으로
# 중복 처리
df.duplicated().sum() # 중복 행 수
df.drop_duplicates(inplace=True)
df.drop_duplicates(subset=["name"])
# 타입 변환
df["age"] = df["age"].astype(int)
df["date"] = pd.to_datetime(df["date"])
df["salary"] = pd.to_numeric(df["salary"], errors="coerce") # 변환 불가→NaN
# 문자열 정제
df["name"] = df["name"].str.strip() # 앞뒤 공백 제거
df["name"] = df["name"].str.lower() # 소문자
df["department"] = df["department"].str.replace(" ", "_")
# 컬럼 이름 변경
df.rename(columns={"name": "employee_name", "age": "employee_age"}, inplace=True)
# 컬럼 추가/삭제
df["annual_bonus"] = df["salary"] * 0.1
df.drop(columns=["annual_bonus"], inplace=True)
groupby — 그룹 집계
# 기본 groupby
dept_stats = df.groupby("department")["salary"].mean()
# 복수 집계
result = df.groupby("department").agg(
avg_salary=("salary", "mean"),
max_salary=("salary", "max"),
count=("name", "count"),
).reset_index()
# 복수 컬럼으로 그룹
df.groupby(["department", "gender"])["salary"].sum()
# transform — 그룹 통계를 원본 행에 추가
df["dept_avg_salary"] = df.groupby("department")["salary"].transform("mean")
df["salary_ratio"] = df["salary"] / df["dept_avg_salary"]
# filter — 조건을 만족하는 그룹만 남김
large_depts = df.groupby("department").filter(lambda x: len(x) >= 2)
merge / join
# 두 DataFrame 병합
employees = pd.DataFrame({
"emp_id": [1, 2, 3, 4],
"name": ["Alice", "Bob", "Charlie", "Diana"],
"dept_id": [10, 20, 10, 30],
})
departments = pd.DataFrame({
"dept_id": [10, 20, 30],
"dept_name": ["Engineering", "Marketing", "HR"],
})
# INNER JOIN (기본)
merged = pd.merge(employees, departments, on="dept_id")
# LEFT JOIN
merged = pd.merge(employees, departments, on="dept_id", how="left")
# 다른 컬럼명 join
pd.merge(df1, df2, left_on="emp_id", right_on="id")
# 세로 합치기 (concat)
all_data = pd.concat([df1, df2, df3], ignore_index=True)
pd.concat([df1, df2], axis=1) # 가로 합치기
pivot_table
# 피벗 테이블
pivot = df.pivot_table(
values="salary",
index="department",
columns="gender",
aggfunc="mean",
fill_value=0,
)
# melt — 피벗 역방향 (wide → long 형태)
melted = pd.melt(
df,
id_vars=["name", "department"],
value_vars=["salary", "bonus"],
var_name="type",
value_name="amount",
)
날짜 처리
df["date"] = pd.to_datetime(df["date"])
# 날짜 컴포넌트 추출
df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day_of_week"] = df["date"].dt.dayofweek # 0=월요일
# 날짜 필터링
mask = (df["date"] >= "2024-01-01") & (df["date"] <= "2024-12-31")
df_2024 = df[mask]
# 시계열 리샘플링 (월별 집계)
df.set_index("date", inplace=True)
monthly = df["sales"].resample("ME").sum() # Month End
정리
| 기능 | 방법 |
|---|---|
| 파일 로드 | read_csv(), read_excel(), read_sql() |
| 결측값 처리 | dropna(), fillna() |
| 조건 필터 | df[df["col"] > value] |
| 그룹 집계 | groupby().agg() |
| 그룹 값 추가 | groupby().transform() |
| 테이블 병합 | pd.merge() (SQL JOIN) |
| 형태 변환 | pivot_table(), melt() |
| 날짜 처리 | .dt.year, resample() |
Pandas의 핵심 패턴은 groupby → agg → merge → pivot 파이프라인입니다.