카테고리: 파이썬 (Python)

파이썬 pandas(판다스) 입문 - 표 데이터 다루기! 설치부터 엑셀 저장까지 🐼

목차10개 항목

안녕하세요! Mojangcam입니다 😎

엑셀에서 마우스로 한 줄 한 줄 필터 걸고, 함수 넣고, 복사·붙여넣기 하다가 "이걸 코드로 한 방에 못 하나?" 싶었던 적 있으시죠? 오늘은 파이썬 데이터 분석의 사실상 표준 라이브러리인 pandas(판다스) 입문편이에요. 표(테이블) 데이터를 만들고 → 원하는 행만 골라내고 → 메뉴별 매출을 요약하고 → 엑셀 파일로 저장하는 것까지, 카페 판매 데이터 예제 하나로 쭉 따라가 볼게요!

앞으로 나올 pandas 실전(엑셀 데이터 분석) 편의 기초가 되는 글이니, 오늘 개념만 잡아두면 다음 편이 훨씬 편해져요.

🧠 pandas가 뭐예요?

pandas는 표 형태의 데이터를 다루는 파이썬 라이브러리예요. 엑셀 시트처럼 행과 열로 이루어진 데이터를 코드로 자유자재로 다룰 수 있게 해줘요.

핵심 개념은 딱 두 개예요.

  • Series(시리즈) : 한 개의 열(column). 예를 들어 "가격" 열 하나가 Series예요.
  • DataFrame(데이터프레임) : Series가 여러 개 모인 표 전체. 엑셀 시트 하나라고 생각하면 돼요.

참고로 pandas는 2026년 1월에 3.0이 정식 출시됐어요 (이 글 기준 최신은 3.0.3, 2026-05-11 릴리스). 성능이 좋아지고 문자열 처리 방식이 개선된 큰 업데이트인데, 입문 단계에서 쓰는 문법은 그대로라 걱정 안 하셔도 돼요. 달라진 점 중 알아두면 좋은 건 글 아래 💡 팁에서 짚어드릴게요.

📌 준비물

  • Python 3.11 이상 — pandas 3.0은 파이썬 3.11+에서만 설치돼요. 버전이 낮으면 pandas 2.x가 설치되니 확인해 주세요.
  • pandas 3.x — 설치 명령어는 아래에!
  • openpyxl — 엑셀(.xlsx) 파일을 읽고 쓸 때 pandas가 내부적으로 사용하는 라이브러리예요.
터미널
pip install pandas openpyxl

설치가 잘 됐는지 확인해 볼게요.

Python
import pandas as pd
print(pd.__version__)  # 3.0.3 같은 버전이 출력되면 성공!

가상환경(venv)을 쓰고 계시다면 활성화한 상태에서 설치해 주세요. 가상환경이 처음이라면 파이썬 가상환경(venv) 완벽 정리 글을 먼저 보고 오시면 돼요.

📌 1단계 - DataFrame 만들고 데이터 살펴보기

먼저 파이썬 딕셔너리로 작은 카페 판매 데이터를 만들어 볼게요.

Python
# pandas 3.x / Python 3.11+
import pandas as pd

data = {
    "날짜": ["2026-08-01", "2026-08-01", "2026-08-02", "2026-08-02", "2026-08-02"],
    "메뉴": ["아메리카노", "라떼", "아메리카노", "케이크", "라떼"],
    "가격": [4500, 5000, 4500, 6500, 5000],
    "수량": [3, 2, 5, 1, 4],
}

df = pd.DataFrame(data)
print(df.head())
print(df.shape)

하나씩 뜯어볼게요 💡

  • pd.DataFrame(data) : 딕셔너리를 표로 변환해요. 키가 열 이름, 값 리스트가 각 열의 데이터가 돼요.
  • df.head() : 표의 앞 5행을 보여줘요. 데이터가 잘 들어갔는지 확인할 때 제일 많이 써요. df.head(3)처럼 개수 지정도 가능해요.
  • df.shape : (행 수, 열 수)를 알려줘요. 여기선 (5, 4)가 나와요.
  • df.info() : 열별 타입과 결측치 개수를 요약해 줘요. 데이터를 처음 받으면 head → shape → info 순서로 훑어보는 게 국룰이에요.

실제로는 이미 있는 파일을 불러오는 경우가 더 많죠? 그럴 땐 한 줄이면 돼요.

Python
df = pd.read_csv("sales.csv")          # CSV 파일 읽기
df = pd.read_excel("sales.xlsx")       # 엑셀 파일 읽기 (openpyxl 필요)

📌 2단계 - 원하는 데이터만 골라내기

엑셀의 필터 기능을 코드로 하는 단계예요. 여기가 pandas의 진짜 매력 포인트!

Python
# 열 하나 선택 (Series)
print(df["메뉴"])

# 조건 필터: 아메리카노 판매 기록만
americano = df[df["메뉴"] == "아메리카노"]
print(americano)

# 조건 두 개: 8/2에 팔린 5,000원 이상 메뉴
result = df[(df["날짜"] == "2026-08-02") & (df["가격"] >= 5000)]
print(result)

# 새 열 추가: 매출 = 가격 × 수량
df["매출"] = df["가격"] * df["수량"]

하나씩 뜯어볼게요 💡

  • df["메뉴"] : 대괄호에 열 이름을 넣으면 그 열만 뽑아요.
  • df[조건] : 조건이 True인 행만 남겨요. 엑셀 필터와 똑같은 개념이에요.
  • & / | : 조건을 여러 개 이을 때 써요 (그리고/또는). 이때 각 조건을 괄호로 꼭 감싸야 해요. 안 감싸면 에러가 나요!
  • df["매출"] = ... : 없는 열 이름에 값을 넣으면 새 열이 생겨요. 열끼리의 곱셈이 행마다 자동으로 계산되는 게 포인트예요.

📌 3단계 - 정렬·요약하고 엑셀로 저장하기

이제 "메뉴별 매출 합계"를 구해볼게요. 엑셀이었다면 피벗 테이블 만들 일이죠?

Python
# 매출 높은 순으로 정렬
print(df.sort_values("매출", ascending=False))

# 메뉴별 매출 합계 (피벗 테이블 느낌!)
by_menu = df.groupby("메뉴")["매출"].sum().sort_values(ascending=False)
print(by_menu)

# 총매출
print("총매출:", df["매출"].sum())

# 결과를 엑셀로 저장
df.to_excel("sales_result.xlsx", index=False)

하나씩 뜯어볼게요 💡

  • sort_values("매출", ascending=False) : 매출 열 기준 내림차순 정렬. ascending=True(기본값)면 오름차순이에요.
  • groupby("메뉴")["매출"].sum() : "메뉴로 묶어서 → 매출 열을 → 합쳐줘"라고 읽으면 돼요. sum() 대신 mean()(평균), count()(개수), max()(최댓값)도 쓸 수 있어요.
  • to_excel("파일명", index=False) : 엑셀 파일로 저장해요. index=False를 안 넣으면 0, 1, 2... 행 번호까지 A열에 저장되니 웬만하면 넣어주세요. CSV로 저장하려면 to_csv("파일명.csv", index=False)!

📌 전체 코드 (복붙 OK)

Python
# pandas 3.x / Python 3.11+
import pandas as pd

# 1. 데이터 만들기 (실무에선 pd.read_csv / pd.read_excel로 파일을 읽어요)
data = {
    "날짜": ["2026-08-01", "2026-08-01", "2026-08-02", "2026-08-02", "2026-08-02"],
    "메뉴": ["아메리카노", "라떼", "아메리카노", "케이크", "라떼"],
    "가격": [4500, 5000, 4500, 6500, 5000],
    "수량": [3, 2, 5, 1, 4],
}
df = pd.DataFrame(data)

# 2. 매출 열 추가
df["매출"] = df["가격"] * df["수량"]
print("=== 전체 데이터 ===")
print(df)

# 3. 조건 필터: 아메리카노만
print("\n=== 아메리카노 판매 기록 ===")
print(df[df["메뉴"] == "아메리카노"])

# 4. 메뉴별 매출 합계 (내림차순)
print("\n=== 메뉴별 매출 TOP ===")
by_menu = df.groupby("메뉴")["매출"].sum().sort_values(ascending=False)
print(by_menu)

# 5. 총매출
print("\n총매출:", df["매출"].sum(), "원")

# 6. 엑셀로 저장 (openpyxl 필요)
df.to_excel("sales_result.xlsx", index=False)
print("sales_result.xlsx 저장 완료!")

📌 실행 결과

텍스트
=== 메뉴별 매출 TOP ===
메뉴
아메리카노    36000
라떼       30000
케이크       6500
Name: 매출, dtype: int64

총매출: 72500 원
sales_result.xlsx 저장 완료!

아메리카노가 36,000원으로 1위네요! 실행한 폴더를 열어보면 sales_result.xlsx 파일이 생겨 있고, 엑셀로 열면 매출 열까지 포함된 표가 그대로 저장돼 있어요.

📌 자주 나는 에러

  1. ModuleNotFoundError: No module named 'pandas'
    • 원인 : pandas가 설치 안 됐거나, 설치한 곳과 다른 파이썬(가상환경)에서 실행 중이에요.
    • 해결 : pip install pandas 다시 실행. VS Code라면 우측 하단 인터프리터가 설치한 가상환경인지 확인하세요.
  2. ImportError: Missing optional dependency 'openpyxl'
    • 원인 : read_excel()·to_excel()은 openpyxl이 따로 필요해요.
    • 해결 : pip install openpyxl 한 줄이면 끝!
  3. KeyError: '메뉴'
    • 원인 : 없는 열 이름을 참조했어요. 열 이름의 오타나 앞뒤 공백(엑셀에서 읽어온 경우 자주 있어요)이 범인이에요.
    • 해결 : print(df.columns)로 실제 열 이름을 확인하고, 공백은 df.columns = df.columns.str.strip()으로 정리하세요.

💡 pandas 3.0에서 달라진 점 (알아두면 좋아요)

  • 문자열 전용 dtype : 예전엔 문자열 열이 object로 표시됐는데, 3.0부터는 str로 깔끔하게 표시돼요. 다른 블로그의 옛날 글과 출력이 조금 달라도 놀라지 마세요!
  • Copy-on-Write 기본 적용 : df[df["가격"] > 5000]["수량"] = 0처럼 두 번 연달아 대괄호로 값을 바꾸는 코드(연쇄 대입)는 이제 원본에 반영되지 않아요. 값을 바꿀 땐 df.loc[df["가격"] > 5000, "수량"] = 0처럼 loc를 쓰는 습관을 들이면 돼요.

📌 마무리

오늘은 pandas의 핵심인 DataFrame을 만들고, 필터링(df[조건]) → 새 열 추가 → groupby 요약 → 엑셀 저장까지 표 데이터 다루기의 기본기를 쭉 훑어봤어요. 이 흐름 하나면 웬만한 엑셀 반복 작업은 코드 몇 줄로 끝낼 수 있어요!

다음 pandas 편에서는 오늘 배운 기초로 실제 엑셀 파일을 불러와서 분석하는 실전편으로 돌아올게요. 결측치 처리, 피벗 테이블, 여러 시트 다루기까지! 기대해주세요 🙌

엑셀 자동화가 급하신 분은 기존에 올린 파이썬 업무 자동화 #1 - 엑셀 자동화 입문 (openpyxl) 글과 파이썬 엑셀 라이브러리 openpyxl 완전정복 글도 함께 보시면 좋아요.

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그