Pandas 기초 실습 정리

조은별·2025년 5월 10일
post-thumbnail

이 문서는 머신러닝 이론 및 파이썬 실습 인강을 들으면서 직접 정리한 학습 기록입니다.
강의를 들으며 이해가 어려웠던 부분, 자주 쓰이지만 헷갈리는 개념, 실무에서 유용한 함수까지 꼼꼼히 정리했습니다.
특히 혼란스러웠던 옵션과 실습 코드들을 중심으로 정리해두었습니다.


Pandas 기초 실습 정리


1. CSV 파일 불러오기 - 다양한 상황 처리

처음에는 그냥 pd.read_csv()만 쓰면 되는 줄 알았는데,
실제로는 파일 구조와 구분자, 인코딩, 컬럼 헤더 유무 등에 따라 다양한 옵션 처리가 필요했다.

기본 사용

import pandas as pd
df = pd.read_csv("data.csv")

구분자가 쉼표(,)가 아닐 때

df = pd.read_csv("data.tsv", delimiter="\t")  # 또는 sep="\t"
  • \t는 탭 구분자 의미. .tsv 파일에서 자주 사용됨

헤더가 없을 때

df = pd.read_csv("data.csv", header=None, names=["이름", "나이", "성별"])
  • header=None을 반드시 같이 써야 첫 줄을 데이터로 인식

인코딩 오류 처리

df = pd.read_csv("data.csv", encoding="cp949")  # 윈도우 환경
df = pd.read_csv("data.csv", encoding="utf-8")  # 리눅스, 맥, 깃허브

실무에서 자주 사용하는 옵션들

df = pd.read_csv("data.csv", skiprows=1, usecols=["이름", "점수"], nrows=100)
  • skiprows: 특정 줄 건너뛰기
  • usecols: 특정 열만 불러오기
  • nrows: 일부 행만 불러오기 (미리보기 용도)

2. 딕셔너리 및 리스트 → DataFrame

딕셔너리 사용 시 주의점

from collections import OrderedDict

data = OrderedDict([
    ("이름", ["철수", "영희"]),
    ("나이", [25, 30])
])
df = pd.DataFrame(data)
  • 순서가 중요한 경우 OrderedDict 사용

리스트로 생성

df = pd.DataFrame([[1, 2], [3, 4]], columns=["A", "B"])

3. apply() 함수 - 복잡한 계산 처리의 핵심

기본 문법

df.apply(func, axis=0 or 1, args=(), **kwargs)
  • axis=0: 열 기준
  • axis=1: 행 기준 → 여러 컬럼 조합 시 자주 사용

예제

# 두 컬럼 합치기
df["총점"] = df.apply(lambda row: row["수학"] + row["영어"], axis=1)

# 외부 인자 전달
def add_bonus(x, bonus):
    return x + bonus

df["보너스"] = df["점수"].apply(add_bonus, bonus=5)

실무에서 이렇게도 씀

  • 여러 컬럼의 값을 조건별로 가공할 때
  • 결측치 처리나 변환 로직 적용 시 유용

4. duplicated() / drop_duplicates()

중복된 행을 제거하거나 중복 여부를 파악할 때 사용

# 중복 여부 확인
df.duplicated(subset=["이름"])

# 중복 제거
df.drop_duplicates(subset=["이름"], keep="last")

# 모든 중복 제거 (고유한 값만 남김)
df[df.duplicated("이름", keep=False) == False]
  • subset: 기준이 되는 컬럼
  • keep: "first", "last", False

5. map() vs applymap()

차이점 요약

함수대상설명
map()Series단일 컬럼 값 변경 또는 매핑
applymap()DataFrame모든 셀에 동일한 함수 적용

예제

# 성별 코드로 변환
df["성별코드"] = df["성별"].map({"남": 0, "여": 1})

# 모든 숫자 값 * 2
df = df.applymap(lambda x: x * 2 if isinstance(x, int) else x)

실무에서는?

  • map()은 범주형 변수를 숫자 또는 라벨로 바꿀 때 자주 사용
  • applymap()은 수치 데이터 전체 가공 시 (예: 정규화, 스케일링 등)

6. filter() 함수와 정규표현식

컬럼 이름 조건으로 필터링할 수 있음

df.filter(like="이름", axis=1)
df.filter(regex="점수$", axis=1)
  • like: 부분 문자열 포함 여부
  • regex: 정규표현식 지원
  • axis=1: 컬럼 기준으로 검색

7. CSV 저장 시 주의할 점

df.to_csv("output.csv", index=False, na_rep="N/A")
  • index: 인덱스 포함 여부
  • na_rep: 결측값(NaN)을 대체할 문자열

8. value_counts()와 unique()

df["성별"].value_counts()
df["성별"].unique()
  • value_counts → 각 값의 빈도수
  • unique → 고유한 값 리스트 반환

9. concat()과 append()

행 방향 병합

pd.concat([df1, df2], ignore_index=True)

열 방향 병합

pd.concat([df1, df2], axis=1)

append (단일 DataFrame만 대상)

df1.append(df2, ignore_index=True)

※ 최근 Pandas 버전에서는 append()는 deprecated 예정


10. 리스트 병합

a = [1, 2]
b = [3, 4]
c = a + b  # [1, 2, 3, 4]

📌 실무에서 자주 쓰는 조합 요약

  • read_csv()에서 delimiter, header, encoding, usecols 조합은 필수
  • apply() + axis=1 + lambda: 복잡한 파생 컬럼 만들기
  • duplicated() + drop_duplicates(): 데이터 클리닝
  • map() + 딕셔너리 매핑: 범주형 라벨 처리
  • filter() + regex: 다수 컬럼 선택시 매우 강력함

내가 느낀 점 정리

  • 처음엔 단순히 "코드만 치면 되겠지" 싶었는데,
    실제로는 데이터 형태와 구조를 파악한 후 옵션들을 제대로 설정하지 않으면 결과가 완전히 달라졌다.

  • 실습 중에 특히 apply, duplicated, read_csv의 다양한 옵션 조합은
    강의 내용보다 훨씬 다양하고, 실무에서는 필수라는 걸 실감했다.

profile
기록과 회고를 통해 성장하는 데이터, AI 엔지니어 지망생입니다.

0개의 댓글