[Pandas] 데이터프레임 메모리 사용 최적화 정리


데이터프레임에서 메모리 사용을 최저고하 하는 방법 정리


1. DataFrame에 대한 내부 수정

1.1 표준할당(Standard Assignment)

  • DataFrame의 새 복사본을 만들고 원본도 그대로 둔다.
import pandas as pd
import numpy as np

df = pd.DataFrame({"col1" : [1, 4, np.NaN],
"col2" : ["A", "B", "C"],
"col3" : [1.3, 2.9, 5.6]})

# 표준할당
dfFillna0 = df.fillna(0)
dfFillna0

1.2 내부할당(inplace Assigmnet Operations)

  • 원래 DataFrame 자체를 수정
# 내부 할당 작업
df.fillna(0, inplace = True)
df

2. CSV에서 필수 열(column)만 읽기

2.1 모든 열 로딩하기

peopleData.info(memory_usage = "deep") # 메모리 사용량
%timeit pd.read_csv("D:/People_data.csv") # csv파일 로드 런타임

2.2 필요한 열만 로딩하기

  • 관심있는 컬럼만 로드하면 메모리 사용률 3배나 감소했음
colList = ["Name", "Birth Date", "State", "Year", "Link"]
data = pd.read_csv("D:/People_data.csv", usecols=colList)
data.info(memory_usage = "deep")
  • 로딩시간도 2배 가깝게 감소
%timeit pd.read_csv("D:/People_data.csv", usecols=colList)

3. 정수 열의 데이터 유형 변경

  • 기본적으로 Pandas는 항상가장 높은 메모리 데이터 유형을 열에 할당
  • astype()메소드를 사용하여 데이터 유형을 변경할수 있음
print("데이터 유형 변환 전 메모리 사용량:", peopleData["Zip Code"].memory_usage())
peopleData["Zip Code"] = peopleData["Zip Code"].astype(np.int32)
print("데이터 유형 변환 후 메모리 사용량:", peopleData["Zip Code"].memory_usage())

4. 범주형 데이터를 나타내는 열의 데이터 유형 변경

  • dtype해보면 object 문자열 유형으로 나올경우 category로 바꿔주면 메모리 사용률이 감소
print("데이터 유형 변환 전 메모리 사용량:", peopleData["Prefix"].memory_usage())
peopleData["Prefix"] = peopleData["Prefix"].astype("category")
print("데이터 유형 변환 후 메모리 사용량:", peopleData["Prefix"].memory_usage())

5. NaN 값으로 열의 데이터 유형 변경

  • astype() 메서드를 사용하여 희소 열의 데이터 유형을 Sparse[str]/Sparse[float]/Sparse[int] 데이터 유형으로 변경
data["missing값을 가지는 열이름"] = data["missing값을 가지는 열이름"].astype("Sparse[float32]")

6. CSV를 읽는 동안 열 데이터 유형 지정

  • 앞에 #3~#5는 사후 팁이었고, CSV 읽을때 바로 제어할수 있게
colList = ["Name", "Birth Date", "State", "Year", "Link"]
data = pd.read_csv("D:/People_data.csv", usecols=colList,
dtype = {"Year":np.int16, "State":"category"})
data.info(memory_usage = "deep")

7. 청크로 CSV 데이터 읽기

  • pandas 읽을때 행 수가 너무많아서 메모리 로드 할수 없을때는 chunksize 인수로 읽으면됨
for chunk in pd.read_csv("D:/People_data.csv", chunksize=5000):
## process chunk
pass

참고




© 2018. by statssy

Powered by statssy