Pandas 완벽 정리 — 데이터 불러오고 정리하기
CSV 불러오기부터 결측값 처리, 필터링, groupby까지 AI 모델에 넣기 전 데이터를 정리하는 전처리 전 과정을 코드와 함께 정리
2026.04.10
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와의 차이
| 비교 항목 | NumPy | Pandas |
|---|---|---|
| 자료구조 | 배열 (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. 오늘 배운 것 한눈에 정리
| 개념 | 핵심 내용 |
|---|---|
| Series | 1차원 데이터 — 엑셀의 열 한 개 |
| DataFrame | 2차원 데이터 — 엑셀 표 전체 |
| 전처리 | 결측값·중복·타입 정리 — AI 성능의 핵심 |
| X, y 분리 | 피처와 라벨을 나눠 NumPy 배열로 변환 |