데이터 분석에 있어 Pandas는 매우 유용한 라이브러리입니다. 그러나 대량의 데이터를 다룰 때는 성능 이슈가 발생할 수 있습니다. 이번 포스트에서는 Pandas를 사용하면서 제가 깨달은 성능 최적화 꿀팁을 공유하겠습니다.
1. 데이터 타입 최적화
Pandas에서 데이터 프레임을 생성할 때 각 열의 데이터 타입을 적절하게 설정하면 메모리 사용량을 크게 줄일 수 있습니다. 기본적으로 Pandas는 데이터 타입을 자동으로 추론하지만, 명시적으로 설정해 주면 더욱 효율적입니다.
예를 들어, 정수형 데이터는 int64가 기본이지만, 작은 정수형 데이터는 int32로 충분할 수 있습니다.
import pandas as pd
data = {
'age': pd.Series([23, 45, 31, 22], dtype='int32'),
'salary': pd.Series([50000, 60000, 55000, 45000], dtype='int32')
}
df = pd.DataFrame(data)
print(df.dtypes)
이처럼 데이터 타입을 적절히 설정하여 메모리 사용량을 줄일 수 있습니다.
2. 벡터화 연산 활용하기
Pandas는 벡터화 연산을 통해 반복문을 사용하는 것보다 훨씬 빠르게 작업을 수행할 수 있습니다. 예를 들어, apply() 함수는 유용하지만 속도 면에서는 벡터화된 연산이 더 빠릅니다.
아래 예시는 간단한 계산을 벡터화된 방식으로 수행하는 방법입니다.
import numpy as np
# 임의의 데이터프레임 생성
df = pd.DataFrame({
'value': np.random.rand(1000000)
})
# apply()를 사용한 방법
# df['new_value'] = df['value'].apply(lambda x: x 2) # 느린 방법
# 벡터화된 연산을 사용한 방법
df['new_value'] = df['value'] 2 # 빠른 방법
이처럼 벡터화된 연산을 활용하면 성능을 크게 향상시킬 수 있습니다.
3. 그룹화 연산 최적화
groupby() 연산은 매우 강력하지만, 대량 데이터를 처리할 때 성능 문제를 일으킬 수 있습니다. 그룹화 연산 후에는 가능한 한 많은 연산을 한 번에 처리하는 것이 좋습니다.
# 예시 데이터 생성
data = {
'category': ['A', 'B', 'A', 'B', 'A', 'B'],
'values': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
# 그룹화를 통한 집계 연산
result = df.groupby('category')['values'].agg(['sum', 'mean', 'count'])
print(result)
여기서 agg() 메소드를 사용하여 여러 집계 연산을 한 번에 처리함으로써 성능을 개선할 수 있습니다.
4. 불필요한 열 삭제
데이터 분석에 필요하지 않은 열은 불필요한 메모리 사용을 초래합니다. 필요한 데이터만 가져오는 것이 중요합니다. 원본 데이터에서 필요한 열만 선택하여 새로운 데이터프레임을 만드는 것이 좋습니다.
# 불필요한 열 삭제
df_filtered = df[['category', 'values']]
print(df_filtered.head())
이렇게 필요한 데이터만 남겨두면 메모리 사용량을 줄이고, 연산 속도를 높일 수 있습니다.
5. 카테고리형 데이터 활용
범주형 데이터는 메모리를 효율적으로 사용하도록 도와줍니다. 문자열 데이터가 많을 경우, 이를 카테고리형으로 변환하는 것이 유리합니다.
# 문자열 데이터를 카테고리로 변환
df['category'] = df['category'].astype('category')
print(df['category'].memory_usage())
카테고리형으로 변환하면 메모리 사용량이 줄어들고, 연산 속도도 빨라질 수 있습니다.
마무리
Pandas를 활용한 데이터 분석에서 성능 최적화는 매우 중요한 요소입니다. 데이터 타입 최적화, 벡터화 연산, 그룹화 연산 최적화, 불필요한 열 삭제, 카테고리형 데이터 활용 등을 통해 메모리 사용량을 줄이고, 연산 속도를 개선할 수 있습니다. 이러한 팁들을 활용하여 더욱 효율적인 데이터 분석을 진행해 보세요.