해당 내용은 Datacamp의 Data engineering track을 정리했습니다.
Writing Efficient Python Code의 chapter 4에 대한 내용입니다.
기본적인 내용보다는 강의를 들으면서 처음 알게 된 내용을 위주로 작성했습니다.
해당 포스팅에는 아래의 내용을 포함하고 있습니다.
- Pandas DataFrame iteration function 비교
- iloc, iterrows, itertuples, apply, Broadcasting
1. Intro to pandas DataFrame iteration
일반적으로 pandas에서 새로운 feature를 만들 때, column간의 연산을 해야할 경우가 존재합니다. 이번 강의에서는 column을 다양하게 연산하는 방법을 배워봅니다.
# Use iloc : 183 ms
import numpy as np
def calc_win_perc(wins, games_played):
win_perc = wins / games_played
return np.round(win_perc, 2)
win_perc_list = []
for i in range(len(baseball_df)):
row = baseball_df.iloc[i]
wins = row['W']
games_played = row['G']
win_perc = calc_win_perc(wins, games_played)
win_perc_list.append(win_perc)
baseball_df['WP'] = win_perc_list
iloc는 index로 해당 record에 접근할 수 있는 방법입니다. 하지만 iloc로 index에 접근하게 되면 전체 record만큼 for 문을 돌아야 하기 때문에 시간이 오래걸립니다.
다음은 iterrows를 활용한 방법입니다. iterrows를 사용하면 index와 record값을 반환합니다.
# Use iterrows - 95.3 ms
for i, row in baseball_df.iterrows():
wins = row['W']
games_played = row['G']
win_perc = calc_win_perc(wins, games_played)
win_perc_list.append(win_perc)
baseball_df['WP'] = win_perc_list
iloc를 적용했을 때보다 절반으로 시간이 줄었습니다.
2. Another iterator method: .itertuples()
이어서 itertuples은 iterrows와 비슷하지만 살짝 다른 것은 row로 받아서 row.index와 row.Team과 같이 접근할 수 있습니다. 또한 iterrows보다 훨씬 빠른 속도를 가지고 있습니다. 하지만, 기본적으로 row['G']처럼 접근하던 방법은 활용이 안되는 단점이 있습니다.
3. pandas alternative to looping
지금까지는 for 문을 활용해서 적용했다면, loop를 대신 apply로 적용하는 방법이 존재합니다. apply는 기본적으로 axis를 지정할 수 있는데, 0은 column, 1은 row를 기준으로 함수를 적용합니다. 또한 함수에 lambda를 활용할 수 있습니다.
run_diffs_apply = baseball_df.apply(
lambda row: calc_run_diff(row['RS'], row['RA']),
axis=1)
baseball_df['RD'] = run_diffs_apply
apply를 적용했을 때, iterrow를 활용했을 때보다 시간이 절반이상 감소합니다.
4. Optimal pandas iterating
마지막으로 numpy의 broadcasting을 활용한 방법을 소개합니다.
run_diffs_np = baseball_df['RS'].values - baseball_df['RA'].values
baseball_df['RD'] = run_diffs_np
DataFrame의 column에 .values를 적용하면 numpy.ndarray 형태를 얻을 수 있습니다. 그러면 numpy형태이기 때문에 broadcasting이 가능합니다. 지금까지 다뤘던 방법 중 가장 빠르게 결과를 얻을 수 있습니다.