예를 들어 아래와 같은 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
위와 같이 훨씬 빠른 속도로 같은 결과를 얻을 수 있습니다.
'Development > Python' 카테고리의 다른 글
[Python] Raspberry Pi에서 selenium 설치 방법 (585) | 2023.12.03 |
---|---|
[Raspberry Pi 4B] Anaconda(MiniForge3) 설치하기 (194) | 2023.12.02 |
GPU를 사용해서 PrivateGPT를 좀 더 빠르게 만드는 방법 (4) | 2023.07.15 |
나만의 사설 ChatGPT 구축 해주는 PrivateGPT 설치 방법 (2) | 2023.07.15 |
[Python] 미니콘다(아나콘다) 가상환경 생성시 오류 CondaHTTPError: HTTP 000 CONNECTION FAILED for url (1) | 2023.02.19 |