Pandas
Python Data Analysis
Python 데이터 분석 라이브러리. DataFrame으로 테이블 데이터 조작. 엑셀의 대체.
Python Data Analysis
Python 데이터 분석 라이브러리. DataFrame으로 테이블 데이터 조작. 엑셀의 대체.
Pandas는 2008년 Wes McKinney가 금융 데이터 분석을 위해 개발한 Python 라이브러리입니다. DataFrame과 Series 데이터 구조로 테이블 형태 데이터를 직관적으로 조작하며, 엑셀처럼 데이터를 다루면서도 프로그래밍의 자동화와 확장성을 제공합니다.
DataFrame은 행(index)과 열(column)로 구성된 2차원 테이블이고, Series는 1차원 배열입니다. SQL처럼 필터링, 그룹화, 조인을 수행하고, loc/iloc으로 레이블/위치 기반 인덱싱을 합니다. 메서드 체이닝으로 여러 연산을 한 줄에 연결할 수 있어 코드가 간결합니다.
CSV, Excel, JSON, SQL, Parquet 등 다양한 포맷을 읽고 쓸 수 있으며, groupby, pivot_table, merge, concat으로 복잡한 데이터 변환을 수행합니다. 결측치 처리(fillna, dropna), 문자열 처리(str accessor), 날짜 처리(dt accessor)를 위한 편의 기능도 풍부합니다.
대용량 데이터(10GB 이상)에서는 메모리 한계가 있어 Polars, Dask, Spark로 전환합니다. 하지만 중소규모 데이터 분석, EDA, 프로토타이핑에서는 여전히 Pandas가 가장 생산적입니다.
import pandas as pd
import numpy as np
# DataFrame 생성
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'age': [25, 30, 35, 28],
'city': ['Seoul', 'Busan', 'Seoul', 'Incheon'],
'salary': [50000, 60000, 70000, 55000]
})
# CSV, Excel 읽기/쓰기
# df = pd.read_csv('data.csv', encoding='utf-8')
# df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# df.to_csv('output.csv', index=False)
# 기본 정보 확인
print(df.head()) # 상위 5행
print(df.info()) # 컬럼 타입, 결측치 정보
print(df.describe()) # 통계 요약
# 컬럼 선택 및 필터링
names = df['name'] # Series 반환
subset = df[['name', 'salary']] # DataFrame 반환
adults = df[df['age'] >= 30] # 조건 필터링
seoul_high = df[(df['city'] == 'Seoul') & (df['salary'] > 55000)]
# loc (레이블 기반) vs iloc (위치 기반)
df.loc[0, 'name'] # 'Alice'
df.iloc[0:2, 1:3] # 0-1행, 1-2열
df.loc[df['age'] > 25, 'salary'] = df.loc[df['age'] > 25, 'salary'] * 1.1 # 조건부 수정
# 그룹화 및 집계
city_stats = df.groupby('city').agg({
'salary': ['mean', 'max', 'count'],
'age': 'mean'
}).round(2)
print(city_stats)
# 피벗 테이블
# pivot = df.pivot_table(values='salary', index='city', aggfunc='mean')
# DataFrame 병합 (SQL JOIN과 유사)
orders = pd.DataFrame({
'order_id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Alice'],
'amount': [100, 200, 150]
})
merged = pd.merge(df, orders, on='name', how='left')
# 결측치 처리
df_with_nan = df.copy()
df_with_nan.loc[0, 'salary'] = np.nan
df_with_nan['salary'].fillna(df_with_nan['salary'].mean(), inplace=True)
# df_with_nan.dropna(subset=['salary']) # 결측치 행 삭제
# 새 컬럼 생성 (벡터화 연산)
df['salary_category'] = pd.cut(
df['salary'],
bins=[0, 55000, 65000, float('inf')],
labels=['Low', 'Medium', 'High']
)
# apply 함수 (커스텀 변환)
df['name_upper'] = df['name'].apply(lambda x: x.upper())
# 메서드 체이닝
result = (df
.query('age >= 25')
.assign(bonus=lambda x: x['salary'] * 0.1)
.groupby('city')['bonus']
.sum()
.sort_values(ascending=False)
)
print(result)
시니어: "EDA는 Pandas로 빠르게 해보고, 프로덕션에서 성능 이슈 나면 Polars로 전환하죠."
주니어: "1GB 파일 읽는데 메모리가 부족해요."
시니어: "dtype 지정해서 메모리 줄이거나, chunksize 파라미터로 나눠서 읽어요. 또는 Parquet으로 변환하면 용량이 확 줄어요."
면접관: "Pandas에서 대용량 데이터 처리 경험이 있나요?"
지원자: "category 타입으로 문자열 컬럼 메모리를 90% 줄이고, read_csv의 usecols로 필요한 컬럼만 읽었습니다. 10GB 이상 데이터는 Dask를 써서 병렬 처리했고, 최종적으로는 Parquet 포맷으로 저장해 I/O 시간을 단축했습니다."
리뷰어: "iterrows() 대신 vectorized 연산 쓰세요. 100배 이상 빨라져요."
개발자: "조건부로 값을 바꿔야 해서 반복문 썼는데, np.where()나 loc으로 바꾸면 되겠네요."