끄적거림

[DataFrame] 여러 DataFrame 가볍게 append하기 in python 본문

Python/Data Handling

[DataFrame] 여러 DataFrame 가볍게 append하기 in python

Signing 2020. 11. 26. 14:39
728x90
반응형

어떤 폴더 안에 있는 많은 엑셀, csv 파일들을 loop를 돌려 차례대로 읽어서 row bind를 하거나,

API를 여러번 호출하여 나온 결과를 순차적으로 row bind하는 경우가 더러 생긴다.

 

이를 완화시킬수 있는 좋은 글을 발견하여 공유하고 정리하고자 한다.

 


 

이럴 때 그 읽어들이는 dataset의 양이 많지 않으면 아래와 같은 방법으로 loop를 돌리면 되지만,

추천하지 않는 방법 1

import pandas as pd

total = pd.DataFrame()
for datapath in datalist:
  t = pd.read_csv(datapath)
  total = total.append(t)

추천하지 않는 방법 2

import pandas as pd

total = pd.DataFrame()
for datapath in datalist:
  t = pd.read_csv(datapath)
  total = pd.concat([total, t])

이럴 경우들은 속도도 안날 뿐더러, 양이 많아지면 어느순간 memory error를 발생시킨다.

 

 

 

다음은 권장하는 방법이고 내가 참고한 글에서 살짝 디벨롭시킨 방법이다.

추천하는 방법!

import collections as co
import pandas as pd

total = co.deque([])

for i, datapath in enumerate(datalist):   # 굳이 enumerate를 안써도 됨.
    t = pd.read_csv(datapath)
    
    try:
        total.append(t)			# list에 데이터셋을 넣어둠
        print('finish ' + str(i) + 'th | datapath: ' + datapath)
    except:
        total_df = pd.concat(total)
        total_df.to_csv("./raised_error.csv", index=False, encoding="utf-8-sig")
        print('DataFrame append error!!!! please check back-up file')
        break

total_df = pd.concat(total)
total_df.to_csv("./complete.csv", index=False, encoding="utf-8-sig")

사실 co.deque([]) 대신에 그냥 list를 사용해도 괜찮다.

하지만, list에서 append를 그냥 할 경우 복잡도가 증가(O(n))한다고 알고 있고, 이 복잡도를 낮출 방법 중에 하나가 바로 collections 패키지의 deque이다.

deque는 append right, append left하든 어디든 상관없이 복잡도가 O(1)이므로 좀 더 좋은 방법이라 생각할 수 있다.

 

 

이것으로 많은 도움이 되길 바란다.

 

 

 

 

참고: emilkwak.github.io/pandas-dataframe-concat-efficiently

 

메모리 덜 쓰고 Pandas DataFrame 병합을 빠르게 하는 방법(여러 개의 용량 큰 파일)

Python, Pandas를 Excel보다 사랑하는 직장인을 위한 블로그

emilkwak.github.io

 

 

 

 

 

 

728x90
반응형
Comments