데알못정을

파이썬 pivot table 생성 시 Memory error 해결하는 방법 본문

Coding

파이썬 pivot table 생성 시 Memory error 해결하는 방법

쩡을이 2023. 7. 6. 14:47
728x90

정말 미치겠고 미치겠다.

아오 이놈아!!

데이터프레임의 크기도 줄여보고

구글링해서 하라는거 다 해봤는데 안되서 정말 쩔쩔 맸다.

데이터셋의 크기가 2백만개가 넘어

매우 컸기 때문에 데이터프레임의 값을

열로 변형하는 pivot trasform은 부하가 많이 컸다.

그러던 중 데이터프레임을 여러개로 분할하여

따로따로 pivot을 시도해보면 어떨까라는 생각에

나는 노가다를 하기 시작했다.

이렇게 나눈다음
이렇게 조지기

 

근데 이렇게 해도 메모리 에러가 발생했다.

진짜 죽고싶었다.

 

그러던 중 read_csv에 chunksize라는 인자가 있다는 것을 알게되었다.

데이터프레임에서 원하는 컬럼만 불러올 수 있듯이,

데이터셋의 샘플을 특정 몇개로 쪼개서(chunk) 불러와 모아두는 하나의 생성자(generator)를 만들 수 있다.

코드는 다음과 같다.

 

import pandas as pd

pharma_col = ['subject_id','charttime','amount','label'] # 불러올 열
lab_signal_col = ['subject_id','charttime','valuenum','label'] # 불러올 열
chunk_size = 10000 # 쪼갤 데이터 갯수

# 데이터 불러오기
signal_lab = pd.read_csv('total_signal_lab.csv', chunksize=chunk_size, usecols = lab_signal_col)
pharma = pd.read_csv('total_pharma.csv', chunksize=chunk_size, usecols = pharma_col)

이렇게 하고 평소대로 signal_lab을 불러오게 되면

다음과 같이 데이터 프레임이 노출되는 것이 아니라

TextFileReader라는 생성자가 나온다.

이를 가지고 다음과 같은 간단한 코드로 내가 원하는 피봇 변형을 수행한후

pd.concat으로 합쳐주면!!!

sglab_chunks = []
for chunk in signal_lab:
    # 변형 작업 수행
    
    transformed_chunk = chunk.pivot_table(index = ['charttime','subject_id'],columns = 'label')
    sglab_chunks.append(transformed_chunk)
    
    
    
pharma_chunks = []
for chunk in pharma:
    # 변형 작업 수행
    
    transformed_chunk = chunk.pivot_table(index = ['charttime','subject_id'],columns = 'label')
    pharma_chunks.append(transformed_chunk)
    
    
    
new_pharma = pd.concat(pharma_chunks)
new_signal_lab = pd.concat(sglab_chunks)

ABPm, APBm 은 사실 같은 변수... 이름을 잘못 지정했네

아주 멋있게 변형이 되었다!

무튼 문제 해결!!

728x90
Comments