파이썬/데이터프레임 다루기

판다스(Pandas) 필터링, 왜 for문보다 벡터 연산이 훨씬 빠를까?

Data Jun 2025. 4. 17. 15:45

데이터를 다루다 보면 종종 "조건에 맞는 행만 추출"해야 할 때가 많습니다.
이때 흔히 떠올리는 방식이 for 반복문 또는 iterrows()인데요, 실제로는 판다스의 벡터 연산을 사용하는 것이 훨씬 빠르고 효율적입니다.

이 글에서는 왜 벡터 연산이 반복문보다 빠른지, 그리고 실제 성능 차이가 얼마나 나는지를 함께 알아보겠습니다.

 

🐢 예시: 반복문 기반 필터링 (iterrows)

import pandas as pd
import numpy as np
import time

df = pd.DataFrame({
    'A': np.random.randint(0, 100, size=1_000_000)
})

start = time.time()
result = []
for _, row in df.iterrows():
    if row['A'] > 50:
        result.append(row['A'])
end = time.time()

print("iterrows 실행 시간:", round(end - start, 2), "초")

⏱ 결과 (약 1,000,000개 데이터 기준)

실행 시간: 10~20초

 

 

⚡ 예시: 벡터 연산 기반 필터링

start = time.time()
result = df[df['A'] > 50]
end = time.time()

print("벡터 연산 실행 시간:", round(end - start, 2), "초")

⏱ 결과

실행 시간: 0.01초

 

왜 이렇게 차이가 날까?

 

  • iterrows()는 하나하나 판다스 Series로 반환하고 비교하는 방식이라 매우 느립니다.
  • 반면 벡터 연산은 NumPy 배열에 C 레벨로 작동하는 최적화된 연산을 적용하기 때문에 속도 차이가 어마어마하죠.

 

실무 팁

  • 데이터 건수가 수천 건 이상이라면 반복문은 반드시 피해야 합니다.
  • 복잡한 조건도 웬만하면 .shift(), .map(), .apply() 또는 .query() 등으로 벡터화해보세요.
  • 어쩔 수 없이 for문이 필요한 상황에도 df.iloc[i]처럼 최소한으로 사용하고, 가능하면 groupby와 함께 해결할 수 있는지 검토해보세요.

 

마무리

Pandas에서 빠르고 효율적인 필터링을 하고 싶다면, 벡터 연산이 답입니다.

 

코드가 짧아지고, 속도는 수십 배 빨라지고, 메모리도 더 효율적으로 쓰이니까요.
데이터가 커질수록 이 차이는 실무에서 체감이 확 옵니다.