본문 바로가기
데이터 분석/데이터 전처리

[Pandas] 19. concat vs append 성능 차이 알아보기

by 부자 꽁냥이 2021. 5. 20.

안녕하세요~ 꽁냥이에요. 칼럼이 같은 여러 개 데이터프레임을 세로로 결합할 때 concat 또는 append를 많이 쓰지요. append는 세로로만 결합할 수 있지만 concat는 가로, 세로 모두 결합할 수 있지요.

 

하지만 이외에도 concat 함수가 더 빠르다는 것을 알고 있나요? 이번 포스팅에서는 append와 concat의 성능 차이를 알아보겠습니다.

 

여기서 다루는 내용은 다음과 같습니다.

 

1. append vs concat

2. concat 제대로 활용하기


   append vs concat

먼저 필요한 모듈을 임포트하고 여기서 사용할 데이터 생성 함수를 정의해줍니다.

 

import pandas as pd
import numpy as np

from tqdm import tqdm
def generate_df(num_col,num_row):
    df = pd.DataFrame()
    for x in range(num_col):
        df[x] = np.random.normal(size=num_row)
    return df

 

그리고 칼럼은 200개, 행은 10만개인 데이터프레임을 30개 만들어서 실험해보려고 합니다.

 

n = 30
num_col = 200
num_row = 100000

 

먼저 append를 이용하여 데이터를 결합하는 경우 시간이 얼마나 걸리는지 확인해봅시다. append를 사용할 때에는 빈 데이터프레임이 아닌 값이 채워진 데이터프레임를 만들어 놓고 append를 해주어야 합니다. 또한 데이터프레임 결합 시에는 특별한 경우가 아니면 ignore_index를 True 지정하여 인덱스를 새롭게 리셋해주어야 합니다. 안 그러면 데이터를 조회할 때 에러가 나거나 엉뚱한 데이터가 조회될 수 있습니다. 

 

%%time
np.random.seed(133)

res_df = generate_df(num_col,num_row)
for i in tqdm(range(n-1),total=n-1):
    temp_df = generate_df(num_col,num_row)
    res_df = res_df.append(temp_df, ignore_index=True)

 

위 코드를 실행해보세요.

 

 

44.7초가 걸렸습니다.

 

이번엔 concat을 이용하여 데이터프레임을 결합해보겠습니다. concat은 append와 달리 빈(empty) 데이터프레임으로 초기화한 뒤 결합할 수 있습니다. 여기서도 ignore_index를 True로 지정하여 인덱스를 리셋하였습니다.

 

%%time
np.random.seed(133)

res_df = pd.DataFrame()
for i in tqdm(range(n),total=n):
    temp_df = generate_df(num_col,num_row)
    res_df = pd.concat([res_df,temp_df], ignore_index=True)

 

위 코드를 실행해보세요.

 

 

오잉? 48.7 초가 걸렸네요. 


   2. concat 제대로 활용하기

앞에서 concat 함수가 append 보다 더 빠르다고 했던 것을 기억하시나요? 그런데 오히려 concat 함수가 더 오래걸렸네요. 무엇이 잘못되었을까요?  그것은 바로 concat을 동적으로 사용했다는 것인데요. concat 함수는 동적으로 사용해서 얻는 성능상의 이점이 없습니다.

 

그렇다면 concat을 사용하여 더 빠르게 데이터프레임을 결합할 수는 없을까요? 아닙니다. 할 수 있습니다. 그 방법은 다음과 같습니다.

 

1) concat을 동적으로 사용하는 것이 아닌, 다시 말하면 루프를 돌 때마다 concat을 사용하는 것이 아니라 결합할 데이터프레임을 먼저 리스트로 모아줍니다.

 

2) 1)에서 만들어진 리스트를 마지막에 concat에 인자로 담아주면 더욱 빠르게 데이터프레임을 결합할 수 있습니다.

 

아래 코드를 보시면 이해할 수 있을거에요.

 

%%time
np.random.seed(133)

res_df_list = [] ## 리스트 초기화
for i in tqdm(range(n),total=n):
    temp_df = generate_df(num_col,num_row)
    res_df_list.append(temp_df) ## 리스트에 담아준다.
    
res_df = pd.concat(res_df_list, ignore_index=True) ## 데이터프레임 리스트를 concat에 넣어 마무리

 

코드를 실행해보세요.

 

 

26.5초로 더 빨라진 것을 확인할 수 있습니다. 여러분 concat을 사용합시다~~>0<


이번 포스팅에서는 append와 concat의 성능 차이를 알아보았고 append 보다는 concat을 사용하는 것이 더 좋다는 것도 알아보았습니다. concat은 사랑입니다.

 

지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요.

 


 

댓글


맨 위로