이전 포스팅들에서 반복 횟수 감소, 딕셔너리 캐싱 방법을 이용해 프로그램의 실행 속도를 개선해봤다. 이번 포스팅에서는, 이전 두 포스팅과 동일한 Dataframe 반복 문제에서 가장 효율적인 실행속도를 보여줄 수 있는 방법을 탐색해보도록 한다.
라이브러리
1
2
3
importpandasaspdimportrandomimporttime
실험 데이터셋
df_a : user_id, some_data 두 컬럼으로 이루어져 있다.
df_a의 some_data 는 약 20% 가량이 NaN 값을 가진다.
df_b : user_id, alt_data 두 컬럼으로 이루어져 있다.
df_a와 df_b의 user_id 집합은 동일하다.
df_b 의 alt_data 에는 결측치가 없다.
1
2
3
4
5
6
7
8
9
10
qnt=10000# 데이터 수
df_a_origin=pd.DataFrame({"user_id":[str(x)forxinrange(1,qnt+1)],"some_data":[random.randint(0,qnt)ifrandom.randint(0,qnt)<qnt*4/5elseNonefor_inrange(qnt)]})df_b=pd.DataFrame({"user_id":[str(x)forxinrange(1,qnt+1)],"alt_data":[random.randint(0,qnt)for_inrange(qnt)]})
실험의 목표
df_a 의 NaN 인 some_data 값을 찾아, df_b 의 동일 user_id 의 alt_data 로 대체한다.
대조군
작동 방식 : df_a 의 각 row 를 순회하며 NaN값 여부를 확인하고, alt_data로 대체한다.
순서
작동
시간복잡도
1
df_a의 각 row를 순회하며, some_data가 NaN인지 확인한다.
O(N_a)
2
NaN값인 경우, df_b에서 동일한 user_id 에 해당하는 alt_data를 찾는다.
O(N_b)
3
row의 some_data 를 찾은 alt_data로 대체한다.
O(1)
전체 시간복잡도 : O(N_a * N_b)
또한 매 반복마다 boolean mask 를 생성하므로 메모리 비용이 발생
Comments