PythonPython 데이터 분석 · 2기초

Pandas 기초 — DataFrame으로 표 데이터 다루기

PythonPandasDataFrame데이터분석CSV

DataFrame과 Series

import pandas as pd
import numpy as np

# Series: 1차원 (한 열)
scores = pd.Series([85, 92, 78, 95, 88], name="점수",
                   index=["철수", "영희", "민준", "지수", "태양"])
print(scores["철수"])  # 85
print(scores[scores > 85])  # 필터링

# DataFrame: 2차원 (여러 열)
df = pd.DataFrame({
    "이름": ["철수", "영희", "민준", "지수"],
    "나이": [25, 30, 28, 22],
    "점수": [85, 92, 78, 95],
    "부서": ["개발", "마케팅", "개발", "디자인"],
})

파일 로드/저장

# CSV
df = pd.read_csv("data.csv", encoding="utf-8")
df = pd.read_csv("data.csv", sep="\t", parse_dates=["날짜"])
df.to_csv("output.csv", index=False, encoding="utf-8-sig")

# Excel
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
df.to_excel("output.xlsx", index=False)

# JSON
df = pd.read_json("data.json")

# 웹에서 직접
df = pd.read_csv("https://example.com/data.csv")

데이터 탐색

print(df.shape)          # (4, 4)
print(df.dtypes)         # 각 열의 데이터 타입
print(df.describe())     # 수치형 열 통계 요약
print(df.info())         # 비어있는 값, 메모리 사용량

print(df.head())         # 처음 5행
print(df.tail(3))        # 마지막 3행
print(df.sample(2))      # 랜덤 2행

print(df.columns.tolist())  # 열 이름 목록
print(df["점수"].value_counts())  # 값별 개수

데이터 선택

# 열 선택
df["이름"]                  # Series
df[["이름", "점수"]]        # DataFrame

# 행 선택
df.iloc[0]                 # 인덱스 번호로
df.iloc[0:3]               # 슬라이싱

df.loc[0]                  # 레이블로
df.loc[df["점수"] > 85]    # 조건

# 조건 필터링
개발팀 = df[df["부서"] == "개발"]
고점수 = df[(df["점수"] > 80) & (df["부서"] == "개발")]
선택부서 = df[df["부서"].isin(["개발", "마케팅"])]

열 추가/변환

# 새 열 추가
df["합격"] = df["점수"] >= 85

# 조건부 값
df["등급"] = pd.cut(df["점수"],
                   bins=[0, 70, 80, 90, 100],
                   labels=["D", "C", "B", "A"])

# apply: 함수 적용
df["이름_길이"] = df["이름"].apply(len)
df["점수_표준화"] = df["점수"].apply(lambda x: (x - df["점수"].mean()) / df["점수"].std())

# 문자열 연산 (.str)
df["이름_대문자"] = df["이름"].str.upper()
df["이름_포함"] = df["이름"].str.contains("수")

집계

# 단순 집계
print(df["점수"].mean())
print(df["점수"].agg(["mean", "std", "min", "max"]))

# groupby
dept_stats = df.groupby("부서")["점수"].agg(["mean", "count", "max"])
print(dept_stats)

# pivot table
pivot = pd.pivot_table(df, values="점수", index="부서",
                       aggfunc=["mean", "count"])

정렬과 중복 처리

# 정렬
df.sort_values("점수", ascending=False)
df.sort_values(["부서", "점수"], ascending=[True, False])

# 중복
print(df.duplicated().sum())    # 중복 행 수
df_clean = df.drop_duplicates()
df_unique = df.drop_duplicates(subset=["이름"])

정리

기능코드
파일 로드pd.read_csv(), read_excel()
탐색.info(), .describe(), .head()
필터df[df["col"] > val]
열 추가df["new"] = ...
집계.groupby().agg()
정렬.sort_values()

다음 편에서는 데이터 정제 — 결측값, 이상값, 타입 변환을 처리하는 방법을 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.