pd.concat이 df.append보다 빠릅니다.

1 분 소요

1-line summary

  • pd.concat(list_of_pd.DataFrame)df.append(df)보다 빠릅니다.

pd.concat vs df.append

  • 쓰고보니 매우 간단한 내용입니다만, 정리합니다.
  • pd.concat는 dataframe으로 구성된 리스트들을 한번에 다 합쳐서 새로운 dataframe을 만들어주는 함수입니다.
  • 반면 df.append는 각 dataframe의 내부 method로 같은 column을 가진 dataframe을 끝에 붙여주는 것이죠.
  • 당연히, 여러 dataframe을 합쳐야 할 때는 pd.concat가 더 빠른 것이 자명해보이지만, 저는 똥인지 된장인지 찍어먹어봐야 하는 사람이라서 직접 해봤습니다.
import pandas as pd 
import numpy as np 
import time

RG = np.random.RandomState(seed=0)

Row_N = 10
csv_N = 1000

def read_csv_as_dict_lst():
    """
    - csv를 dictionary_lst로 읽었다고 생각함.
    - row에 대한 정보를 {column_name: value}로 표현하여 모든 리스트에 넣어서 리턴. 
    """
    def random_string(str_len=20):
        return "".join(map(chr, RG.randint(ord('a'), ord('z'), str_len)))
    col_a = RG.randint(0, 100, Row_N)
    col_b = RG.random(Row_N)
    col_c = [random_string() for _ in range(0, Row_N)]
    return [{"col_A": a, "col_B": b, "col_C": c} for a, b, c in zip(col_a, col_b, col_c)] 

csv_lst = [read_csv_as_dict_lst() for _ in range(0, csv_N)]
##########################################################
# df_A.append(df_B)
# df_A에 df_B를 추가한 새로운 dataframe을 리턴함.
start_time = time.time()
df_append = pd.DataFrame(csv_lst[0])
for each_csv in csv_lst[1:]:
    df_append = df_append.append(pd.DataFrame(each_csv))
print(f"== df.append execution time: {time.time() - start_time:.5f}")
##########################################################
# pd.concat: 
# list of pd.DataFrame을 모두 합쳐서 하나의 DF로 리턴하는 함수
start_time = time.time() 
df_concat = pd.concat([pd.DataFrame(each_csv) for each_csv in csv_lst])
print(f"== pd.concat execution time: {time.time() - start_time:.5f}")
assert len(df_concat) == len(df_append)
  • 결과를 보면 pd.concatdf.append에 비해서 약 40% 정도의 시간만 소요합니다. 뭐 당연한 결과이긴 하죠.
== df.append execution time: 4.10729
== pd.concat execution time: 1.69913

댓글남기기