파이썬 데이터 분석 #1 pandas 시작: 노트북과 DataFrame이라는 작업대
매달 같은 엑셀 파일을 열어 같은 필터를 걸고 같은 피벗 테이블을 만들고 있다면, 그 작업은 코드로 옮길 수 있습니다. 이 시리즈는 엑셀이나 SQL로 데이터를 만져 본 적이 있는 분이 pandas로 같은 일을 코드로 처리하는 방법을 7편에 걸쳐 익히는 과정입니다. 파이썬 문법은 모던 파이썬 기초 수준이면 충분합니다.
- #1 pandas 시작: 노트북과 DataFrame이라는 작업대 ← 이번 글
- #2 데이터 불러오기와 탐색
- #3 선택과 필터
- #4 변형과 결측치
- #5 그룹과 집계·결합
- #6 시각화
- #7 polars 맛보기와 마무리
엑셀로 하던 일을 코드로 옮기면 무엇이 좋아지는가 #
엑셀은 훌륭한 도구입니다. 그런데 분석이 커지면 세 군데에서 한계에 부딪힙니다. 이 세 가지가 시리즈 전체를 끌고 가는 동기입니다.
- 재현이 어렵습니다. 클릭으로 만든 결과는 과정이 남지 않아서, 한 달 뒤 “이 숫자가 어떻게 나왔는지"라는 질문에 답하기 어렵습니다. 코드는 과정 자체가 기록이라 다시 실행하면 같은 결과가 나옵니다.
- 큰 데이터를 못 엽니다. 엑셀 시트의 한계는 1,048,576행이고, 그 전에 이미 스크롤과 수식 재계산이 버거워집니다. pandas는 메모리가 허락하는 한 수백만 행도 같은 코드로 다룹니다.
- 반복이 수작업입니다. 파일 100개에 같은 정리를 해야 하면 엑셀에서는 100번 엽니다. 코드에서는 반복문 하나로 끝납니다.
환경 준비: uv로 pandas와 Jupyter 설치 #
이번 글에서는 작업 환경을 만들고, pandas의 두 핵심 구조인 Series와 DataFrame을 손으로 만들어 보겠습니다. 환경은 uv 하나로 만듭니다. 프로젝트를 초기화하고 pandas와 JupyterLab을 추가한 뒤, 노트북 서버를 띄웁니다.
uv init data-analysis --python 3.14
cd data-analysis
uv add pandas jupyterlab
uv run jupyter lab
# 브라우저가 열리면 왼쪽 런처에서 Python 3 노트북을 새로 만드세요노트북이라는 작업 방식 #
.py 스크립트는 위에서 아래로 한 번에 실행되지만, 노트북은 코드를 셀이라는 작은 칸에 나눠 적고 셀 하나를 실행하면 그 결과가 바로 아래에 표시됩니다. 변수는 셀이 끝나도 살아 있어서 다음 셀에서 이어서 쓸 수 있습니다. 데이터 분석은 “불러오고, 살펴보고, 한 번 바꿔 보고, 결과를 확인하고"의 반복이라, 바꾼 셀만 다시 실행하고 결과를 눈으로 확인하는 노트북이 이 흐름에 잘 맞습니다. 이 시리즈의 코드는 모두 노트북 셀 기준으로 적겠습니다.
Series와 DataFrame #
pandas의 구조는 두 개만 알면 됩니다.
- Series: 값이 한 줄로 늘어선 1차원 구조입니다. 엑셀의 열 하나에 해당합니다.
- DataFrame: Series 여러 개가 옆으로 붙은 2차원 표입니다. 엑셀의 시트 하나에 해당합니다.
비유는 여기까지가 안전하고, 차이가 하나 있습니다. pandas의 모든 행에는 인덱스라는 이름표가 붙습니다. 엑셀의 행 번호는 그냥 위치지만 pandas의 인덱스는 데이터의 일부라서, 정렬하거나 필터해도 각 행을 따라다니고, 날짜나 ID를 인덱스로 쓰면 위치가 아니라 이름으로 행을 찾을 수 있습니다. 지금은 행마다 이름표가 있다는 것만 기억하면 충분합니다.
첫 DataFrame 만들기 #
가장 간단한 재료인 dict로 만들어 보겠습니다. 키가 열 이름, 값 리스트가 열 내용이 됩니다.
import pandas as pd
df = pd.DataFrame({
"메뉴": ["아메리카노", "라떼", "크루아상", "샌드위치"],
"가격": [4500, 5000, 3800, 6500],
"판매량": [120, 95, 40, 25],
"분류": ["음료", "음료", "베이커리", "푸드"],
})
df 메뉴 가격 판매량 분류
0 아메리카노 4500 120 음료
1 라떼 5000 95 음료
2 크루아상 3800 40 베이커리
3 샌드위치 6500 25 푸드셀 마지막 줄에 변수 이름만 적으면 노트북이 표로 렌더링해 줍니다. print()가 필요 없습니다. 맨 왼쪽의 0〜3이 방금 설명한 인덱스입니다. 따로 지정하지 않으면 0부터 시작하는 번호가 자동으로 붙습니다.
열 접근과 dtypes #
열 하나를 꺼내면 Series가 나옵니다.
df["가격"]
# 0 4500
# 1 5000
# 2 3800
# 3 6500
# Name: 가격, dtype: int64Series끼리는 엑셀 수식처럼 통째로 연산할 수 있습니다. 행마다 수식을 끌어 내릴 필요 없이 새 열을 한 줄로 만듭니다.
df["매출"] = df["가격"] * df["판매량"]
df표 오른쪽에 행마다 가격 × 판매량이 계산된 매출 열이 붙습니다. 각 열의 타입은 dtypes로 확인합니다.
df.dtypes
# 메뉴 object
# 가격 int64
# 판매량 int64
# 분류 object
# 매출 int64숫자 열은 int64, 문자열 열은 object로 잡혔습니다. 실제 분석에서는 숫자가 들어 있어야 할 열이 object로 읽히는 일이 자주 생기는데, 그때 가장 먼저 보는 것이 이 dtypes입니다.
데이터를 보는 첫 세 동작: head, info, describe #
처음 보는 데이터를 받았을 때 반사적으로 실행하는 세 가지가 있습니다. 이 중 describe()의 출력만 잠깐 보겠습니다.
df.head() # 앞 5행 미리 보기
df.info() # 행 수, 열별 타입, 결측치 개수
df.describe() # 숫자 열의 평균, 최소/최대 등 요약 통계 가격 판매량 매출
count 4.00 4.00 4.00
mean 4950.00 70.00 332375.00
min 3800.00 25.00 152000.00
max 6500.00 120.00 540000.004행짜리 표라 시시해 보이지만, 행이 10만 개일 때 이 한 줄이 데이터의 전체 윤곽을 보여 줍니다. 세 동작의 출력을 제대로 읽는 법은 #2 데이터 불러오기와 탐색에서 실제 CSV 파일로 자세히 다루겠습니다.
노트북의 함정: 셀 실행 순서 #
노트북에는 한 가지 함정이 있습니다. 셀은 적힌 순서가 아니라 실행한 순서대로 반영됩니다. 위쪽 셀을 고치고 다시 실행하면 아래쪽 셀들은 여전히 옛날 결과를 기준으로 만든 변수를 들고 있고, 셀을 지워도 그 셀이 만든 변수는 메모리에 남아 있습니다. 이 어긋남이 쌓이면 “노트북에서는 됐는데 다시 열면 안 되는” 상태가 됩니다. 예방법은 단순합니다. 셀은 가능하면 위에서 아래로 읽히는 순서로 정리하고, 구간을 마무리할 때마다 Restart Kernel and Run All Cells로 처음부터 끝까지 한 번에 돌려 봅니다. 처음부터 끝까지 깨끗하게 도는 노트북만이 재현 가능한 분석입니다. 첫 동기였던 “재현 가능"은 노트북을 쓴다고 저절로 얻어지는 것이 아니라 이 습관에서 나옵니다.
정리 #
이번 글에서 만든 토대입니다.
- 엑셀 대비 코드 분석의 장점: 재현 가능, 큰 데이터, 반복 자동화
uv add pandas jupyterlab+uv run jupyter lab으로 환경 구성- Series는 열 하나, DataFrame은 표 하나, 인덱스는 행의 이름표
- dict에서 DataFrame 만들기, 열 접근, 열 연산,
dtypes확인 - 첫 세 동작 head / info / describe와 셀 실행 순서 함정
다음 글(#2 데이터 불러오기와 탐색)에서는 직접 만든 표가 아니라 실제 CSV·엑셀 파일을 읽어 들이는 법을 다루겠습니다. read_csv의 주요 옵션, 인코딩 문제, 그리고 head / info / describe로 낯선 데이터의 윤곽을 잡는 순서까지 정리하겠습니다.