Pandas 완벽 정리 — 데이터 불러오고 정리하기

CSV 불러오기부터 결측값 처리, 필터링, groupby까지 AI 모델에 넣기 전 데이터를 정리하는 전처리 전 과정을 코드와 함께 정리

2026.04.10

PandasDataFrameSeriespreprocessingCSVdata cleaningfillnagroupbyPython

0. 시리즈

제목역할
1편NumPy 완벽 정리 — 숫자 배열 다루기데이터 기초
2편⬅️Pandas 완벽 정리 — 데이터 불러오고 정리하기데이터 전처리
3편Matplotlib / Seaborn — 데이터 시각화시각화
4편Scikit-learn — 머신러닝 실습 입문ML 실습
5편TensorFlow / Keras — 딥러닝 모델 만들기DL 실습
6편PyTorch 입문 — Keras와 무엇이 다를까?DL 심화

1. Pandas란?

1-1. Pandas가 뭔가요?

Pandas(판다스) 는 Python에서 표 형태의 데이터를 쉽게 다루기 위해 만들어진 라이브러리입니다. 이름은 Panel Data의 줄임말입니다.

현실에서 AI에 쓰이는 데이터는 대부분 CSV 파일이나 엑셀 파일처럼 행(row)과 열(column)로 구성된 표 형태입니다. Pandas는 이런 데이터를 불러오고, 정리하고, AI 모델에 넣을 수 있는 형태로 변환하는 역할을 합니다.

1-2. NumPy와의 차이

비교 항목NumPyPandas
자료구조배열 (ndarray)표 (DataFrame)
데이터 타입숫자만숫자 + 문자 + 날짜 등 혼합 가능
열 이름없음 (인덱스만)있음 (이름, 나이, 점수 등)
주요 역할수치 연산데이터 탐색·정리·전처리

💡 Pandas는 내부적으로 NumPy를 기반으로 동작합니다. 즉, Pandas를 배우면 1편에서 배운 NumPy가 그 아래에서 작동하고 있습니다.

1-3. AI 파이프라인에서 Pandas의 위치

[원본 데이터 (CSV, 엑셀)]
        ↓
  📦 Pandas — 불러오기, 정리, 전처리
        ↓
  🔢 NumPy 배열로 변환
        ↓
  🤖 AI 모델 학습 (Scikit-learn / TensorFlow)

Pandas는 AI 파이프라인의 가장 앞단, 즉 데이터를 모델에 넣기 전 준비하는 단계를 담당합니다.

1-4. Pandas 설치

bashpip install pandas

Google Colab은 이미 설치되어 있어 별도 설치 불필요합니다.

pythonimport pandas as pd
print(pd.__version__)  # 예: 2.2.1

2. 핵심 자료구조 2가지

2-1. Series — 1차원 데이터

Series 는 엑셀의 열 한 개와 같습니다. 인덱스와 값으로 구성됩니다.

pythonimport pandas as pd

scores = pd.Series([85, 92, 78, 96, 88])
print(scores)
# 0    85
# 1    92
# 2    78
# 3    96
# 4    88

# 인덱스를 직접 지정할 수도 있습니다
scores = pd.Series([85, 92, 78], index=["철수", "영희", "민준"])
print(scores["영희"])  # 92

2-2. DataFrame — 2차원 데이터

DataFrame 은 여러 Series가 합쳐진 표입니다. 엑셀 시트 전체와 같습니다.

pythondata = {
    "이름":  ["철수", "영희", "민준"],
    "나이":  [25, 28, 23],
    "점수":  [85, 92, 78]
}

df = pd.DataFrame(data)
print(df)
#    이름  나이  점수
# 0  철수   25   85
# 1  영희   28   92
# 2  민준   23   78

2-3. Series와 DataFrame의 관계

python# DataFrame에서 열 하나를 꺼내면 Series가 됩니다
print(type(df["점수"]))  # <class 'pandas.core.series.Series'>
print(df["점수"])
# 0    85
# 1    92
# 2    78

3. 데이터 불러오기

3-1. CSV 파일 불러오기

pythondf = pd.read_csv("data.csv")

# 자주 쓰는 옵션
df = pd.read_csv("data.csv", encoding="utf-8")      # 한글 파일
df = pd.read_csv("data.csv", index_col=0)           # 첫 열을 인덱스로
df = pd.read_csv("data.csv", nrows=100)             # 앞 100행만

3-2. 엑셀 파일 불러오기

bashpip install openpyxl  # 엑셀 처리용 추가 패키지 필요
pythondf = pd.read_excel("data.xlsx", sheet_name="Sheet1")

3-3. 데이터 기본 확인

데이터를 불러온 후 반드시 아래 4가지로 현황을 먼저 파악합니다.

pythondf.head()       # 상위 5행 출력 (기본값)
df.tail(3)      # 하위 3행 출력
df.info()       # 열 이름, 데이터 타입, 결측값 여부
df.describe()   # 수치형 열의 기초 통계 (평균, 표준편차, 최솟값 등)
df.shape        # (행 수, 열 수) 확인

3-4. Google Colab에서 파일 업로드하는 법

pythonfrom google.colab import files
uploaded = files.upload()  # 파일 선택 창이 뜹니다

import io
df = pd.read_csv(io.BytesIO(uploaded["data.csv"]))

4. 데이터 탐색 & 선택

4-1. 열(column) 선택하기

python# 열 하나 선택 → Series 반환
df["이름"]

# 열 여러 개 선택 → DataFrame 반환
df[["이름", "점수"]]

# 열 목록 확인
df.columns

4-2. 행(row) 선택 — loc vs iloc

python# loc — 인덱스 이름으로 선택
df.loc[0]           # 인덱스가 0인 행
df.loc[0:2]         # 인덱스 0~2행 (끝 포함)
df.loc[0, "점수"]   # 0행의 점수 열

# iloc — 순서(정수)로 선택
df.iloc[0]          # 첫 번째 행
df.iloc[0:2]        # 0~1행 (끝 미포함, Python 슬라이싱 방식)
df.iloc[0, 2]       # 0행 2번째 열

💡 loc vs iloc 헷갈릴 때: loc라벨, iloc위치(i = integer)

4-3. 조건으로 필터링하기

python# 점수가 90 이상인 행만
df[df["점수"] >= 90]

# 나이가 25 이상이고 점수가 80 이상인 행
df[(df["나이"] >= 25) & (df["점수"] >= 80)]

# 이름이 "철수"인 행
df[df["이름"] == "철수"]

4-4. 정렬하기

pythondf.sort_values("점수", ascending=False)  # 점수 내림차순
df.sort_values(["나이", "점수"])          # 나이 → 점수 순으로 정렬

5. 데이터 전처리 — AI 학습 전 필수 작업

실제 데이터는 항상 지저분합니다. 결측값, 중복 데이터, 잘못된 타입 등을 정리하는 과정이 전처리이며, AI 성능에 가장 큰 영향을 줍니다.

5-1. 결측값(NaN) 처리

pythondf.isnull()           # 각 셀의 결측 여부 (True/False)
df.isnull().sum()     # 열별 결측값 개수

# 결측값 제거
df.dropna()           # 결측값 있는 행 전체 삭제
df.dropna(axis=1)     # 결측값 있는 열 전체 삭제

# 결측값 채우기
df.fillna(0)               # 모든 결측값을 0으로
df["점수"].fillna(df["점수"].mean())  # 평균값으로 채우기

5-2. 중복 데이터 제거

pythondf.duplicated()       # 중복 행 확인
df.drop_duplicates()  # 중복 행 제거

5-3. 데이터 타입 변환

pythondf.dtypes                          # 각 열의 데이터 타입 확인
df["나이"] = df["나이"].astype(float)  # 정수 → 실수
df["점수"] = df["점수"].astype(str)    # 숫자 → 문자

5-4. 열 조작

python# 열 이름 변경
df.rename(columns={"점수": "score", "나이": "age"}, inplace=True)

# 새 열 추가
df["합격여부"] = df["score"] >= 90

# 열 삭제
df.drop(columns=["합격여부"], inplace=True)

6. 데이터 집계 & 그룹화

6-1. 기본 통계

pythondf["점수"].sum()    # 합계
df["점수"].mean()   # 평균
df["점수"].count()  # 개수 (결측값 제외)
df["점수"].max()    # 최댓값
df["점수"].min()    # 최솟값

6-2. 그룹별 분석 — groupby

pythondata = {
    "학과":  ["공학", "공학", "경영", "경영", "공학"],
    "점수":  [85, 92, 78, 96, 88]
}
df = pd.DataFrame(data)

# 학과별 평균 점수
df.groupby("학과")["점수"].mean()
# 경영    87.0
# 공학    88.3

# 학과별 여러 통계 한 번에
df.groupby("학과")["점수"].agg(["mean", "max", "count"])

6-3. 피벗 테이블

엑셀의 피벗 테이블과 동일한 개념입니다.

pythondf.pivot_table(values="점수", index="학과", aggfunc="mean")

7. AI와의 연결

7-1. DataFrame을 NumPy 배열로 변환하기

AI 모델은 Pandas DataFrame을 직접 받지 않고 NumPy 배열 을 입력으로 받습니다. 전처리가 끝난 DataFrame을 배열로 변환하는 것이 마지막 단계입니다.

python# 방법 1
array = df.values

# 방법 2 (권장)
array = df.to_numpy()

print(type(array))   # <class 'numpy.ndarray'>
print(array.shape)   # (행 수, 열 수)

7-2. 피처(X)와 라벨(y) 분리하기

머신러닝 모델은 항상 입력 데이터(X)정답(y) 을 분리해서 받습니다.

pythondata = {
    "공부시간": [2, 4, 6, 8, 10],
    "수면시간": [8, 7, 6, 5, 4],
    "합격여부": [0, 0, 1, 1, 1]
}
df = pd.DataFrame(data)

X = df.drop(columns=["합격여부"]).to_numpy()
y = df["합격여부"].to_numpy()

print(X)
# [[ 2  8]
#  [ 4  7]
#  [ 6  6]
#  [ 8  5]
#  [10  4]]

print(y)  # [0 0 1 1 1]

이 상태면 바로 Scikit-learn 모델에 X, y를 넣어 학습을 시작할 수 있습니다. 4편(Scikit-learn) 에서 이 데이터를 그대로 사용합니다.


8. 마무리

8-1. 오늘 배운 것 한눈에 정리

개념핵심 내용
Series1차원 데이터 — 엑셀의 열 한 개
DataFrame2차원 데이터 — 엑셀 표 전체
전처리결측값·중복·타입 정리 — AI 성능의 핵심
X, y 분리피처와 라벨을 나눠 NumPy 배열로 변환