IT/Python

pandas itertuples, iterrows 성능 및 사용법 비교

엘티엘 2020. 11. 27. 13:00

매번 헷갈리는 pandas dataframe의 itertuples, iterrows 에 대한 비교를 해보자

 

둘다 Pansdas DataFrame을 행 단위로 반복처리하는 목적으로 사용하는데,

사용법이 약간 다르기 때문에, 매번 헷갈린다 ㅎ

 

이번 포스팅은 이것에 대한 사용법과 성능 비교를 목적으로 한다

 

사용법 차이

아래는 iterrows, itertuples의 sample 코드이다.

import pandas as pd


data = pd.DataFrame({'a': range(100000), 'b': range(100000)})

#iterrows
for row in data.iterrows():
    print('row:', row)
    # print('key:', row[0], 'val:', row[1])
    break
  
   
for k, v in data.iterrows():
    print('key', k, 'val', v)
    break


#itertuples
for t in data.itertuples():
    print("tuple", t)
    break
    
for i, a, b in data.itertuples():
    print('index: ', i, 'a:', a, 'b:', b)
    break

 

먼저 iterrows 는

반복문에서 아래 형태로 값을 저장할 수 있다

  • 행 전체 (row) - for row in data.iterrows():
  • key, value - for k, v in data.iterrows():

인덱스와 특정 값에 접근하는 방법이다

  • 인덱스 접근: row[0], key
  • a 값 접근: row[1].a, row[1]['a'], key.a, key['a']

 

itertuples는

반복문에서 아래 형태로 값을 저장할 수 있다.

  • 행 전체 (tuple) - for t in data.itertuples():
  • index, a, b - for i, a, b in data.itertuples():

인덱스와 특정 값에 접근하는 방법이다

  • 인덱스 접근: tuple.Index, index
  • a 값 접근: tuple.a, a

 

성능차이

notebook 에서 %time magic command 를 활용해 측정해 봤다.

%%time
nums=10000
c = []
for _, val in data[:nums].iterrows():
    c.append(val.a + val.b)
  • num=10000: 863ms
  • num=50000: 4.25s
%%time
nums=10000
c = []
for i, a, b in data[:nums].itertuples():
    c.append(a + b)
  • num=10000: 11.6ms
  • num=50000: 51.3ms

 

itertuple 이 약 80배 정도 성능이 좋고 (앞으로 itertuple만 쓰는걸로...ㅎㅎ)

데이터가 5배 증가했을때, iterrows, itertuples 모두 동일하게 5배 시간이 오래걸렸다.

 

반응형