[파이썬] pandas 데이터 프레임의 메모리 사용량 최적화

데이터 분석에서 pandas는 많은 사람들에게 인기 있는 라이브러리입니다. 하지만 대용량의 데이터를 다룰 때에는 메모리 사용량이 큰 문제가 될 수 있습니다. 이러한 문제를 해결하기 위해 pandas에서는 데이터 프레임의 메모리 사용량을 최적화할 수 있는 기능을 제공합니다. 이 글에서는 pandas 데이터 프레임의 메모리 사용량 최적화 방법을 소개합니다.

1. 데이터 유형 최적화

pandas는 기본적으로 데이터를 저장할 때 적절한 데이터 유형을 선택하여 사용합니다. 그러나 때로는 pandas가 데이터 유형을 잘못 추정할 수도 있습니다. 따라서 데이터 프레임의 각 열의 데이터 유형을 최적화함으로써 메모리 사용량을 줄일 수 있습니다.

import pandas as pd

# 데이터 프레임 생성
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4.1, 5.2, 6.3],
    'C': ['x', 'y', 'z']
})

# 데이터 프레임의 데이터 유형 확인
df.dtypes

# 열의 데이터 유형 최적화
df['A'] = df['A'].astype('int8')
df['B'] = df['B'].astype('float16')
df['C'] = df['C'].astype('category')

# 최적화된 데이터 프레임의 데이터 유형 확인
df.dtypes

위의 코드에서는 데이터 프레임의 각 열의 데이터 유형을 최적화하는 예제를 보여줍니다. 예를 들어, 열 ‘A’는 int8로, 열 ‘B’는 float16로, 열 ‘C’는 category로 데이터 유형을 변경하였습니다.

2. 카테고리 데이터 사용

문자열 데이터를 저장하는 경우, 카테고리 데이터 타입을 사용하여 메모리 사용량을 크게 줄일 수 있습니다. 카테고리 데이터 타입은 고유한 값의 개수보다 작은 메모리 공간을 사용하여 문자열 값을 저장하는 방식입니다.

import pandas as pd

# 데이터 프레임 생성
df = pd.DataFrame({
    'A': ['x', 'y', 'z', 'x'],
    'B': ['a', 'b', 'c', 'a']
})

# 열 'A'와 'B'를 카테고리 데이터 타입으로 변경
df['A'] = df['A'].astype('category')
df['B'] = df['B'].astype('category')

# 메모리 사용량 확인
df.info()

위의 코드에서는 열 ‘A’와 ‘B’를 카테고리 데이터 타입으로 변경하는 예제를 보여줍니다. 변경 후에는 df.info()를 통해 메모리 사용량의 감소를 확인할 수 있습니다.

3. 메모리 절약을 위한 데이터 분할

대용량의 데이터 프레임을 작업할 때, 모든 데이터를 한 번에 메모리에 로드하는 것은 효율적이지 않을 수 있습니다. 이러한 경우에는 데이터를 작은 조각으로 분할하여 메모리를 절약할 수 있습니다.

import pandas as pd

# 대용량 데이터 프레임 로드 (csv 파일로 가정)
df_large = pd.read_csv('large_data.csv')

# 데이터 분할
chunk_size = 10000
chunks = [df_large[i:i+chunk_size] for i in range(0, df_large.shape[0], chunk_size)]

# 작은 조각으로 분할된 데이터 프레임 확인
for chunk in chunks:
    print(chunk.head())

위의 코드에서는 csv 파일로부터 대용량 데이터 프레임을 로드한 후, chunk_size의 크기로 데이터를 작은 조각으로 분할하는 예제를 보여줍니다. 이렇게 분할된 데이터 프레임은 각각 메모리에 로드될 때 메모리 사용량을 줄일 수 있습니다.

결론

pandas는 대용량의 데이터를 다룰 수 있는 훌륭한 라이브러리입니다. 그러나 메모리 사용량이 큰 문제가 될 수 있습니다. 이러한 경우에는 데이터 프레임의 메모리 사용량을 최적화하는 방법을 사용하여 효율적으로 작업할 수 있습니다. 데이터 유형 최적화, 카테고리 데이터 사용, 메모리 절약을 위한 데이터 분할 등의 방법을 활용하여 대용량 데이터를 효과적으로 다룰 수 있습니다.