Python

pandas

  • -
Step 7: Pandas 완전 정복

🐼 Pandas 완전 정복

DataFrame과 Series로 데이터를 자유자재로 다룬다

📦

01. Pandas란?

Pandas(Panel Data)는 표 형식(테이블) 데이터를 다루는 Python 라이브러리다.

엑셀을 Python 코드로 다루는 것과 같다고 생각하면 이해하기 쉽다.

왜 NumPy만으론 부족할까?

⚡ NumPy
  • 숫자 계산에 특화
  • 모든 원소가 같은 타입
  • 컬럼 이름 없음
  • 단순 배열 연산
🐼 Pandas
  • 다양한 자료형 지원
  • 컬럼마다 다른 타입 OK
  • 이름 있는 행/열
  • 필터링, 정렬, 그룹화
Python
import pandas as pd   # 관례적으로 pd로 줄여서 씁니다
import numpy  as np
💡 import pandas as pd — pandas는 관례적으로 pd로 줄여서 불러온다. 코딩 세계의 약속이다.
🏗️

02. Series & DataFrame

Series — 1차원 데이터

하나의 열(Column), 즉 인덱스 + 값으로 이루어진 1차원 구조다.

Python
# 리스트로 Series 만들기
ages = pd.Series([25, 30, 28, 35])
print(ages)

# 인덱스 이름을 직접 지정할 수도 있어요
ages_named = pd.Series(
    [25, 30, 28, 35],
    index=["Alice", "Bob", "Charlie", "Dave"]
)
print(ages_named)
▶ 출력
0 25 1 30 2 28 3 35 dtype: int64 Alice 25 Bob 30 Charlie 28 Dave 35 dtype: int64

DataFrame — 2차원 데이터 (표)

DataFrame = 여러 개의 Series(열)가 합쳐진 2차원 표 구조다.

각 열은 서로 다른 자료형을 가질 수 있다. (문자열, 정수, 실수 등)

Python
# 딕셔너리로 DataFrame 생성 (가장 흔한 방법)
data = {
    "Name":  ["Alice", "Bob", "Charlie"],
    "Age":   [25, 30, 35],
    "Score": [85.5, 90.3, 78.9]
}
df = pd.DataFrame(data)
print(df)

# 열 하나를 꺼내면 → Series!
age_col = df["Age"]
print(type(age_col))   # pandas.core.series.Series
▶ 출력
Name Age Score 0 Alice 25 85.5 1 Bob 30 90.3 2 Charlie 35 78.9 <class 'pandas.core.series.Series'>
🔑 핵심 관계: DataFrame 안에 Series가 들어있다.
DataFrame(표) = 여러 Series(열)의 집합
🎯

03. 데이터 접근하기

열(Column) 선택

Python
# 열 하나 선택 → Series 반환
df["Name"]          # 또는 df.Name (점 표기법)

# 열 여러 개 선택 → DataFrame 반환 (리스트 안에 리스트!)
df[["Name", "Score"]]
▶ 출력
0 Alice Name Score 1 Bob → 0 Alice 85.5 2 Charlie 1 Bob 90.3 Name: Name 2 Charlie 78.9
⚠️ 헷갈림 주의!  df["Name"]은 대괄호 하나,  df[["Name","Score"]]은 대괄호가 두 겹이다. 반환 타입이 달라진다.

행(Row) 선택 — iloc vs loc

📍 df.iloc[ ] — 숫자 위치
# 0번째 행 (첫 번째)
df.iloc[0]

# 0~1번째 행 슬라이싱
df.iloc[0:2]

# 마지막 행
df.iloc[-1]
🏷️ df.loc[ ] — 인덱스 라벨
# 인덱스 라벨이 0인 행
df.loc[0]

# 라벨 0~1 범위 (끝 포함!)
df.loc[0:1]

# 이름을 인덱스로 설정 후
df2.loc["Alice"]
🎓 iloc vs loc 차이: iloc은 항상 정수 위치(0부터 시작), loc은 실제 인덱스 라벨을 사용한다. loc은 슬라이싱 시 끝 포함이라는 점이 다르다.

조건부 필터링

Python
# 나이가 30 이상인 행만 선택
df[df["Age"] >= 30]

# Score가 80 초과이고 Age가 30 미만인 행
df[(df["Score"] > 80) & (df["Age"] < 30)]

# Name이 특정 값인 행
df[df["Name"] == "Alice"]
▶ df[df["Age"] >= 30] 출력
Name Age Score 1 Bob 30 90.3 2 Charlie 35 78.9
📚

04. 주요 함수 레퍼런스

데이터 탐색 함수

메서드 반환 타입 설명
df.info() None 컬럼명, 타입, null 개수, 메모리 사용량 출력 (반환값 없음!)
df.describe() DataFrame 수치형 컬럼의 평균·표준편차·최소/최대·사분위수 요약
df.shape tuple (행 수, 열 수) 반환. 예: (3, 3)
df.columns Index 컬럼 이름 목록. .tolist()로 리스트 변환 가능
df.index Index 행 인덱스 목록 반환
df.head(n) DataFrame 상위 n개 행 미리보기 (기본값 n=5)
df.tail(n) DataFrame 하위 n개 행 미리보기 (기본값 n=5)

데이터 처리 함수

메서드 반환 타입 설명
df["col"].mean() float 해당 열의 평균값
df["col"].sum() float 해당 열의 합계
df["col"].max() 해당 열의 최댓값
df["col"].min() 해당 열의 최솟값
df.sort_values(by="col") DataFrame 특정 열 기준 정렬. 원본 불변! (inplace=True 옵션으로 원본 변경 가능)
df.groupby("col") GroupBy 그룹별 집계. 예: df.groupby("Age").mean()
Python — 함수 활용 예시
# 탐색
print(df.shape)               # (3, 3)
print(df.columns.tolist())    # ['Name', 'Age', 'Score']
print(df.head(2))             # 상위 2개 행

# 통계
print(df["Score"].mean())     # 84.9
print(df["Age"].max())        # 35

# 정렬 (오름차순)
print(df.sort_values(by="Score"))

# 정렬 (내림차순)
print(df.sort_values(by="Score", ascending=False))
▶ sort_values(by="Score", ascending=False) 출력
Name Age Score 1 Bob 30 90.3 0 Alice 25 85.5 2 Charlie 35 78.9
✏️ TODO 11

DataFrame 만드는 3가지 방법

같은 데이터를 다양한 방법으로 DataFrame으로 만들 수 있다.

🎯 목표: 아래 세 가지 방법 모두 동일한 DataFrame을 만들어야 한다.

방법 1. List[Dict]

각 행(Row)을 딕셔너리로 표현하고, 그것들을 리스트로 묶는다.

Python
alice   = {"Name": "Alice",   "Age": 25, "Score": 85.5}
bob     = {"Name": "Bob",     "Age": 30, "Score": 90.3}
charlie = {"Name": "Charlie", "Age": 35, "Score": 78.9}

df_1 = pd.DataFrame([alice, bob, charlie])
print(df_1)
▶ 출력
Name Age Score 0 Alice 25 85.5 1 Bob 30 90.3 2 Charlie 35 78.9

방법 2. List[List] + columns 지정

각 행을 리스트로 만들고, columns 매개변수로 열 이름을 따로 지정한다.

Python
data = [
    ["Alice",   25, 85.5],
    ["Bob",     30, 90.3],
    ["Charlie", 35, 78.9],
]
columns = ["Name", "Age", "Score"]

df_2 = pd.DataFrame(data, columns=columns)
print(df_2)

방법 3. numpy.ndarray

숫자만 numpy 배열로 만들고, 문자열 열은 따로 삽입한다. dtype에 주의해야 한다.

Python
names = ["Alice", "Bob", "Charlie"]
nums = np.array([
    [25, 85.5],
    [30, 90.3],
    [35, 78.9],
])

df_3 = pd.DataFrame(nums, columns=["Age", "Score"])
df_3.insert(0, "Name", names)       # 첫 번째 위치에 Name 열 삽입
df_3["Age"] = df_3["Age"].astype(int)  # float → int 변환 필요!

# 검증
assert df.equals(df_3), "다릅니다!"
print("✅ 모든 DataFrame 테스트 통과!")
⚠️ 왜 .astype(int)가 필요한가?
numpy 배열은 숫자를 섞으면 float으로 통일한다. 그래서 Age가 25.0이 되는데, 원본 df는 int64이기 때문에 타입을 맞춰줘야 한다.

세 가지 방법 정리

  • Dict of Lists — 열 기준으로 생각할 때 편리하다
    pd.DataFrame({"col": [...]}) — 가장 직관적인 방법이다
  • List of Dicts — 행 기준으로 생각할 때 편리하다
    pd.DataFrame([{row1}, {row2}, ...]) — API 응답 데이터에 자주 등장한다
  • List of Lists + columns — 열 이름을 따로 지정한다
    pd.DataFrame([...], columns=[...]) — CSV 데이터 파싱 시 유용하다
  • numpy.ndarray — 수치 데이터 + 문자열 열 삽입
    dtype에 주의해야 한다. 문자열 열은 insert()로 따로 추가한다

'Python' 카테고리의 다른 글

NumPy 축(Axis) 개념 완벽 이해  (0) 2026.03.03
numpy - broadcasting 연산  (0) 2026.03.03
jupyterLab  (0) 2026.03.02
UV  (0) 2026.03.01
pyenv  (0) 2026.02.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.