본문으로 건너뛰기
Advertisement

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 파이프라인입니다.

Advertisement