Pandas (Python Data Analysis)
Python 생태계에서 데이터 분석의 표준 라이브러리인 Pandas의 핵심 개념과 원리를 다룹니다.
필수Internal
1. 핵심 자료구조 (Core Structures)
Series (1차원)
- 개념: 엑셀의 ‘한 열(Column)‘과 같습니다.
- 특징: 모든 데이터가 동일한 타입(dtype)을 가집니다. (예: 모두 정수, 모두 날짜)
- 구성: 값(Values) + 인덱스(Index)
import pandas as pd
# Series 생성
price_series = df['sale_price']
print(f"타입: {type(price_series)}")
print(f"데이터 타입(dtype): {price_series.dtype}")
print(f"크기: {len(price_series):,}")실행 결과
타입: <class 'pandas.core.series.Series'> 데이터 타입(dtype): float64 크기: 124,892
DataFrame (2차원)
- 개념: 엑셀의 ‘시트(Sheet)‘와 같습니다.
- 특징: 여러 개의 Series가 모여 있는 형태입니다.
- Column-Major: 같은 열(Column)끼리 메모리에 연속적으로 저장됩니다. 그래서 열 단위 연산이 빠릅니다.
# DataFrame의 각 컬럼은 Series
print(f"df['category']의 타입: {type(df['category'])}")
print(f"df[['category', 'sale_price']]의 타입: {type(df[['category', 'sale_price']])}")실행 결과
df['category']의 타입: <class 'pandas.core.series.Series'> df[['category', 'sale_price']]의 타입: <class 'pandas.core.frame.DataFrame'>
2. 벡터화 연산 (Vectorization)
Pandas(와 Numpy)의 가장 큰 특징은 Loop(for문)를 쓰지 않는다는 점입니다.
❌ 느린 방식 (Python for-loop)
# 100만 개 데이터 기준
total = 0
for price in df['price']:
total += price파이썬 인터프리터가 매번 리스트 원소를 하나씩 꺼내 타입을 확인하고 더합니다. (Overhead 큼)
✅ 빠른 방식 (Vectorization)
total = df['price'].sum()C언어로 최적화된 내부 함수가 메모리 블록 전체를 한 번에(CPU SIMD 방식 등) 처리합니다. 수백 배 빠릅니다.
실행 결과 (100만 개 기준)
For-loop Sum: 0.1892 sec Vectorized Sum: 0.0004 sec ======================================== Speedup: 473x 빠름!
벡터화 연산 예시
# 집계 연산
print(f"총 매출: ${df['sale_price'].sum():,.2f}")
print(f"평균 매출: ${df['sale_price'].mean():.2f}")
# 벡터 산술 연산
df['profit'] = df['sale_price'] - df['cost']
df['margin_rate'] = (df['profit'] / df['sale_price'] * 100).round(2)실행 결과
총 매출: $5,234,892.45 평균 매출: $41.92
3. 인덱싱 (Indexing: loc vs iloc)
가장 헷갈리는 부분입니다. 명확히 구분해야 합니다.
| 구분 | 문법 | 설명 | 예시 |
|---|---|---|---|
| Label 기반 | loc[행이름, 열이름] | 이름으로 찾습니다. | df.loc[0, 'category'] |
| Position 기반 | iloc[행번호, 열번호] | **숫자(순서)**로 찾습니다. | df.iloc[0, 3] (0번째 행, 3번째 열) |
# loc: Label 기반 (이름으로)
sample.loc[0, 'category'] # 'Jeans'
# iloc: Position 기반 (순서로)
sample.iloc[0, 1] # 'Jeans'
# 주의: loc은 끝 포함, iloc은 끝 미포함
sample.loc[0:2] # 0, 1, 2 (3개)
sample.iloc[0:2] # 0, 1 (2개)조건부 필터링
# Boolean Indexing (가장 많이 사용)
high_value = df[df['sale_price'] > 100]
# 복합 조건
filtered = df[(df['sale_price'] > 50) & (df['category'] == 'Jeans')]
# query() 메서드 (SQL 스타일)
filtered_query = df.query("sale_price > 50 and category == 'Jeans'")Best Practice: 가능하면 명시적인
loc를 사용하거나,query()메서드를 사용하는 것이 가독성에 좋습니다.
커리큘럼 (Curriculum)
1. 데이터 로드와 탐색
CSV, Excel, JSON 등 다양한 형식의 데이터를 로드하고 기본적인 탐색 방법을 학습합니다.
2. 데이터 정제
결측치 처리, 중복 제거, 이상치 탐지 등 데이터 품질 관리 방법을 학습합니다.
3. 고급 필터링
다양한 조건을 활용한 데이터 필터링 기법을 학습합니다.
4. 그룹화와 집계
groupby()와 집계 함수를 활용한 데이터 요약 및 분석 방법을 학습합니다.
5. 데이터 병합
여러 데이터프레임을 결합하는 다양한 방법을 학습합니다.
6. 날짜/시간 처리
시계열 데이터 처리를 위한 datetime 타입 활용법을 학습합니다.
7. 피벗과 재구조화
데이터의 형태를 변환하는 피벗, 멜트, 스택 연산을 학습합니다.
SQL ↔ Pandas 변환 가이드
| SQL | Pandas |
|---|---|
SELECT col1, col2 | df[['col1', 'col2']] |
WHERE condition | df.query("condition") 또는 df[condition] |
GROUP BY col | df.groupby('col') |
JOIN | df.merge(df2, on='key') |
ORDER BY col | df.sort_values('col') |
LIMIT n | df.head(n) |
# SQL: SELECT category, SUM(sale_price)
# FROM df
# GROUP BY category
# ORDER BY SUM(sale_price) DESC
# LIMIT 5
result = (
df.groupby('category')['sale_price']
.sum()
.sort_values(ascending=False)
.head(5)
)실행 결과
category Outerwear & Coats 892341.23 Jeans 654892.11 Sweaters 543210.87 Suits & Sport Coats 432109.65 Swim 321098.43 Name: sale_price, dtype: float64
핵심 정리
- Series: 1차원 배열 (엑셀 한 열), 동일 타입
- DataFrame: 2차원 테이블 (엑셀 시트), 여러 Series의 조합
- 벡터화: for-loop 대신 내장 함수 사용 → 100~1000배 성능 향상
- loc: Label(이름) 기반, 끝 포함
- iloc: Position(숫자) 기반, 끝 미포함
💡
다음 단계
이 개념들을 직접 실습하려면 커리큘럼의 각 섹션으로 이동하여 예제 코드를 따라해보세요!
Last updated on