Skip to Content

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 변환 가이드

SQLPandas
SELECT col1, col2df[['col1', 'col2']]
WHERE conditiondf.query("condition") 또는 df[condition]
GROUP BY coldf.groupby('col')
JOINdf.merge(df2, on='key')
ORDER BY coldf.sort_values('col')
LIMIT ndf.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

핵심 정리

  1. Series: 1차원 배열 (엑셀 한 열), 동일 타입
  2. DataFrame: 2차원 테이블 (엑셀 시트), 여러 Series의 조합
  3. 벡터화: for-loop 대신 내장 함수 사용 → 100~1000배 성능 향상
  4. loc: Label(이름) 기반, 끝 포함
  5. iloc: Position(숫자) 기반, 끝 미포함
💡
다음 단계

이 개념들을 직접 실습하려면 커리큘럼의 각 섹션으로 이동하여 예제 코드를 따라해보세요!

Last updated on

🤖AI 모의면접실전처럼 연습하기