[Pandas] Dataframe의 각 셀에 대한 연산을 벡터화(Vectorization)로 빠르게 처리하기

 예를 들어 아래와 같은 DataFrame이 있고, 각 컬럼의 min, max를 계산해서 해당 셀의 값이 컬럼별 min, max의 10% 내에 해당하는 값이면 해당 셀의 값을 1로 바꾸고 아니면 0으로 바꾸는 코드를 생각 해 보면,

 일반적으로 이중 루프문을 사용해서 DataFrame의 각 셀들을 순회하면서 해당 로직을 적용하는 코드를 쉽게 상상할 수 있습니다.

data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)

min = df.min()
max = df.max()
mean = df.mean()

# 이중 루프를 사용해서 개별 cell에 접근하는 방법
for index, row in df.iterrows():
    for col in df.columns:
        if (min[col] + min[col]*0.1) <= row[col] <= (max[col] - max[col]*0.1):
            df.loc[index, col] = 1
        else:
            df.loc[index, col] = 0

하지만 DataFrame의 크기가 큰 경우 이 방법을 사용하면 루프순회하는 속도가 무지막지하게 느려집니다. 이럴 때 Pandas의 벡터화(Vectorization) 표현식을 아래와 같이 사용하면 빠른 속도로 연산이 가능합니다.

data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)

min_val = df.min()
max_val = df.max()

# 벡터화를 통한 계산식 적용
calc = ((df >= (min_val + min_val * 0.1)) & (df <= (max_val - max_val * 0.1))).astype(int)
calc

 

위와 같이 훨씬 빠른 속도로 같은 결과를 얻을 수 있습니다.