작성일자 : 2024-01-02
Ver 0.1.1
Pandas로 데이터 분석을 하다보면 같은 형태의 데이터가 날짜별로 적재가 되는 로그 데이터라던지 월별 테이블과 같은 파일들을 한번에 합쳐서 분석하고자 하는 필요가 있다. 한두개의 파일이라면 직접 코드를 작성해도 무방하지만 그 갯수가 많아진다면 직접 입력하기란 번거로워진다. 이런 경우 반복문으로 파일들을 손쉽게 합칠 수 있는데, 그 방법 중에서도 효율적으로 병합하는 방법에 대해서 정리해보겠다.
1. 방법(1) - 권장하지 않는 방법
첫번째 방법은 빈 DataFrame을 선언한 후 For Loop으로 각 파일을 읽어 붙이는 형태이다.
# 권장하지 않는 사례
import pandas as pd, os
dir = '/.../dir/path'
df = pd.DataFrame() # 빈 DataFrame 생성
for fname in os.listdir(dir):
df_temp = pd.read_excel(os.path.join(dir, fname))
df= df.append(df_temp) # 매 Loop에서 취해진 DataFrame을 앞서 정의한 빈 DataFrame에 붙임
위 방법은 아래의 두 가지 이유에서 좋지 않다.
- 메모리를 많이 쓴다.
- append()로 인해 df_accum은 점점 사이즈가 커진다. 반복할 때마다 점점 더 커지는 사이즈에다가 df_temp를 붙이는 작업은 메모리 사용 차원 관점에서 비효율적이다.
- 속도가 느리다.
- 성능적으로 당연히 크기가 큰 DataFrame을 append()하는 것보다 작은 것을 하는 게 더 빠를 것이다. 해당 관점에서 사이즈가 점점 커져 가는 df은 느린 속도의 주요 원인이된다.
2. 방법(2) - 권장 방법
위 문제점 중에서 ‘조금이라도 메모리를 덜 낭비’하면서 속도는 훨씬 빨리 할 수 있는 방법이 있다.
1) DataFrame을 list에 먼저 담아 두고, 2) 그 이후에 담아둔 list 통째로 pd.concat()에 넣어 병합하는 방법이다.
# 권장하는 사례
import pandas as pd, os
dir = '/.../dir/path'
list_of_df = [] # 빈 list 생성
for fname in os.listdir(dir):
df_temp = pd.read_excel(os.path.join(dir, fname))
list_of_df.append(df_temp) # 매 Loop에서 취해진 DataFrame을 위의 list에 적재
df = pd.concat(list_of_df) # list 속 DataFrame들을 concat으로 일괄 병합
병합 이후 최종 데이터 사이즈가 크다면 절대적으로 사용해야할 메모리량이 있기에 메모리 효율성을 급격하게 높일 수는 없겠지만, 처리 속도 향상 측면에서는 좋은 방법일 것이다.
참고 사이트 : https://emilkwak.github.io/pandas-dataframe-concat-efficiently
작성일자 : 2024-01-02
Ver 0.1.1
Pandas로 데이터 분석을 하다보면 같은 형태의 데이터가 날짜별로 적재가 되는 로그 데이터라던지 월별 테이블과 같은 파일들을 한번에 합쳐서 분석하고자 하는 필요가 있다. 한두개의 파일이라면 직접 코드를 작성해도 무방하지만 그 갯수가 많아진다면 직접 입력하기란 번거로워진다. 이런 경우 반복문으로 파일들을 손쉽게 합칠 수 있는데, 그 방법 중에서도 효율적으로 병합하는 방법에 대해서 정리해보겠다.
1. 방법(1) - 권장하지 않는 방법
첫번째 방법은 빈 DataFrame을 선언한 후 For Loop으로 각 파일을 읽어 붙이는 형태이다.
# 권장하지 않는 사례
import pandas as pd, os
dir = '/.../dir/path'
df = pd.DataFrame() # 빈 DataFrame 생성
for fname in os.listdir(dir):
df_temp = pd.read_excel(os.path.join(dir, fname))
df= df.append(df_temp) # 매 Loop에서 취해진 DataFrame을 앞서 정의한 빈 DataFrame에 붙임
위 방법은 아래의 두 가지 이유에서 좋지 않다.
- 메모리를 많이 쓴다.
- append()로 인해 df_accum은 점점 사이즈가 커진다. 반복할 때마다 점점 더 커지는 사이즈에다가 df_temp를 붙이는 작업은 메모리 사용 차원 관점에서 비효율적이다.
- 속도가 느리다.
- 성능적으로 당연히 크기가 큰 DataFrame을 append()하는 것보다 작은 것을 하는 게 더 빠를 것이다. 해당 관점에서 사이즈가 점점 커져 가는 df은 느린 속도의 주요 원인이된다.
2. 방법(2) - 권장 방법
위 문제점 중에서 ‘조금이라도 메모리를 덜 낭비’하면서 속도는 훨씬 빨리 할 수 있는 방법이 있다.
1) DataFrame을 list에 먼저 담아 두고, 2) 그 이후에 담아둔 list 통째로 pd.concat()에 넣어 병합하는 방법이다.
# 권장하는 사례
import pandas as pd, os
dir = '/.../dir/path'
list_of_df = [] # 빈 list 생성
for fname in os.listdir(dir):
df_temp = pd.read_excel(os.path.join(dir, fname))
list_of_df.append(df_temp) # 매 Loop에서 취해진 DataFrame을 위의 list에 적재
df = pd.concat(list_of_df) # list 속 DataFrame들을 concat으로 일괄 병합
병합 이후 최종 데이터 사이즈가 크다면 절대적으로 사용해야할 메모리량이 있기에 메모리 효율성을 급격하게 높일 수는 없겠지만, 처리 속도 향상 측면에서는 좋은 방법일 것이다.
참고 사이트 : https://emilkwak.github.io/pandas-dataframe-concat-efficiently