판다스 성능 최적화/실전 팁
1. pandas 옵션 설정: pd.set_option
- 판다스의 출력, 표시, 계산 환경 등 다양한 옵션을 사용자 정의하는 함수
- 표 전체/소수점/행수/컬럼수/너비 등 가독성, 디버깅, 리포트 자동화에 매우 유용!
● 예시
import pandas as pd
pd.set_option('display.max_rows', 100)
pd.set_option('display.max_columns', 50)
pd.set_option('display.float_format', '{:.2f}'.format)
pd.set_option('display.max_colwidth', 200)
● 언제 쓰면 좋은가?
- 대용량/긴 데이터 출력, 리포트 자동화, 디버깅/가독성 개선
2. 대용량 데이터 처리 시 메모리 절약법
- 수백MB~수GB급 데이터도 “가볍게 다루기” 위한 판다스 실전 테크닉
- 불필요한 object→category 변환, float64→float32 등 다운캐스팅, 필요 컬럼만 로딩, chunk 분할 등
● 예시
df = pd.read_csv('data.csv', usecols=['A', 'B', 'C'])
df['코드'] = df['코드'].astype('category')
df['숫자'] = pd.to_numeric(df['숫자'], downcast='integer')
for chunk in pd.read_csv('data.csv', chunksize=100000):
process(chunk)
● 실무 TIP
- 수억행 데이터도 chunk로 나누면 램 부족 걱정 줄어듦
- 분석 대상 컬럼만 로딩, 필요 없는 컬럼은 drop()
3. Categorical 데이터 타입
- *반복값이 많은 object 컬럼(예: 성별, 지역, 등급 등)**을 category 타입으로 바꾸면 메모리 사용량·집계 속도 대폭 개선
- 분석/머신러닝/대용량 데이터에서 반드시 써야 하는 최적화법
● 예시
df['지역'] = df['지역'].astype('category')
- 메모리 사용량, groupby/merge 속도 개선
4. MultiIndex 활용, 복잡한 데이터 재구조화
- 2개 이상 인덱스(계층형 인덱스)로 데이터를 그룹화/집계/슬라이싱/피벗 등 고급 구조화
- 엑셀 피벗테이블, 월별·지역별 매출 등 “다차원 데이터” 분석에 필수
● 예시
df = df.set_index(['연도', '지역'])
- groupby().sum(), unstack(), stack(), pivot_table() 등과 자주 연계
5. 벡터연산 (Apply 대신 Vectorized)
- for문, apply 대신 “한 줄 연산(벡터연산)” → 최고의 속도/성능 향상 (C로 구현된 내부 연산 덕분)
- 가능하면 연산, 조건, 수식, 파생 모두 “Series 전체”로 처리!
● 예시
df['합계'] = df['A'] + df['B']
df['합격'] = df['점수'] >= 60
df['정제'] = df['문자열'].str.replace('a','b')
- np.where, np.select, .str., .dt., 등 모두 벡터화
6. 실무 사례: 여러 데이터 소스(엑셀/CSV/API 등) 통합
- 여러 파일/시트/포맷(엑셀, CSV, json, API 등)을 한 번에 불러와서 합치기
- 실무 데이터 분석, 리포트, 통계자료 구축 시 거의 필수!
● 예시: 여러 CSV 합치기
import glob
import pandas as pd
files = glob.glob('data/2024*.csv')
df_list = [pd.read_csv(f) for f in files]
df_total = pd.concat(df_list, ignore_index=True)
● 예시: 엑셀 여러 시트 합치기
xls = pd.ExcelFile('all_data.xlsx')
df = pd.concat([xls.parse(sheet) for sheet in xls.sheet_names])
● 예시: API + 엑셀 + CSV 병합
df1 = pd.read_csv('a.csv')
df2 = pd.read_excel('b.xlsx')
import requests
data = requests.get('api_url').json()
df3 = pd.DataFrame(data)
df_all = pd.concat([df1, df2, df3], ignore_index=True)
● 실무 TIP
- 서로 포맷이 달라도 컬럼명/구조만 맞추면 pd.concat, merge로 쉽게 통합!
- 통합 전 데이터 정제/컬럼명 일치 필수
정리
| 항목 | 개념/기능 설명 | 실전 활용 상황/장점 |
|---|
| set_option | 출력, 환경 등 옵션 제어 | 대용량 데이터, 가독성, 리포트 자동화 |
| 메모리 절약법 | 타입 다운캐스트, chunk, 필요 컬럼만 로딩 등 | 대용량/메모리 부족/속도 향상 |
| Categorical | 반복값 많은 object → 카테고리 | groupby/merge/메모리/속도 개선 |
| MultiIndex | 계층형(다중) 인덱스, 구조화/집계/슬라이싱 | 복잡한 데이터 구조/엑셀 피벗 분석 등 |
| 벡터연산 | apply/for 대신 “한 번에 연산” | 속도/성능/코드 품질 모두 개선 |
| 여러 데이터 통합 | 다양한 소스(엑셀/CSV/API 등) 한 번에 합치기 | 실무 대량 데이터 집계/통계/리포트 |