Python
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(열)의 집합
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이기 때문에 타입을 맞춰줘야 한다.
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
소중한 공감 감사합니다