데이터 분석에서 Pandas는 매우 유용한 라이브러리입니다. 그러나 데이터의 크기가 커질수록 필터링 및 조작 속도가 느려지는 문제가 발생할 수 있습니다. 이 블로그에서는 Pandas로 데이터를 효율적으로 필터링하는 몇 가지 기법을 소개하고, 속도를 개선하는 방법을 함께 살펴보겠습니다.

1. Pandas 필터링 기본

Pandas에서 데이터를 필터링하는 기본적인 방법은 조건에 맞는 행을 선택하는 것입니다. 예를 들어, 아래와 같은 데이터프레임이 있다고 가정해 보겠습니다.

import pandas as pd

data = {
    '이름': ['Alice', 'Bob', 'Cathy', 'David', 'Eva'],
    '나이': [23, 35, 45, 29, 34],
    '점수': [85, 90, 78, 88, 95]
}

df = pd.DataFrame(data)

이 데이터프레임에서 나이가 30세 이상인 사람들의 데이터를 필터링하고 싶다면 다음과 같은 코드를 사용할 수 있습니다.

filtered_df = df[df['나이'] >= 30]
print(filtered_df)

2. 성능 개선을 위한 방법

2.1. query() 메서드 사용

Pandas의 query() 메서드는 코드의 가독성을 높이면서도 성능을 개선할 수 있는 방법입니다. 위의 예제를 query()를 사용하여 다시 써보겠습니다.

filtered_df = df.query('나이 >= 30')
print(filtered_df)
query() 메서드는 조건을 문자열로 입력받아 처리하기 때문에, 복잡한 조건을 필터링할 때 가독성이 높아집니다. 또한, 내부적으로는 NumPy의 배열 연산을 사용하여 성능이 향상되는 경우가 많습니다.

2.2. Boolean Indexing 최적화

Pandas에서 필터링을 할 때 Boolean Indexing 방식이 매우 일반적입니다. 이를 최적화하는 방법으로는 불필요한 연산을 피하고, 조건식을 미리 계산하여 사용하는 것입니다. 예를 들어, 다음과 같이 사용할 수 있습니다.

age_condition = df['나이'] >= 30
filtered_df = df[age_condition]
print(filtered_df)

이렇게 하면 조건을 한 번만 계산하고, 그 결과를 재사용함으로써 성능을 높일 수 있습니다.

2.3. loc와 iloc 활용

loc와 iloc는 데이터프레임에서 특정 행과 열을 선택할 때 유용한 방법입니다. 필터링 후 특정 열만을 선택하고 싶다면 loc를 사용할 수 있습니다.
filtered_df = df.loc[df['나이'] >= 30, ['이름', '점수']]
print(filtered_df)

이렇게 하면 필터링한 후 필요한 열만 선택하여 메모리 사용량을 줄일 수 있습니다.

2.4. dask를 통한 병렬 처리

대규모 데이터셋을 다룰 때는 dask 라이브러리를 활용하여 병렬 처리를 시도해볼 수 있습니다. dask는 Pandas와 유사한 API를 제공하며, 대량의 데이터를 여러 조각으로 나누어 처리할 수 있습니다. 예를 들어:

import dask.dataframe as dd

dask_df = dd.from_pandas(df, npartitions=2)
filtered_dask_df = dask_df[dask_df['나이'] >= 30].compute()
print(filtered_dask_df)

이와 같이 dask를 사용하면 메모리 효율성을 높이고, 시간도 절약할 수 있습니다.

마무리

Pandas는 강력한 데이터 조작 도구이지만, 대규모 데이터셋을 처리할 때는 속도가 느려질 수 있습니다. 여기에서는 query(), Boolean Indexing, loc 및 iloc 활용, 그리고 dask를 통한 병렬 처리 방법을 통해 데이터 필터링의 성능을 개선하는 방법에 대해 살펴보았습니다. 이러한 기법들을 적절히 활용하면 데이터 분석의 효율성을 크게 높일 수 있습니다. 데이터 분석 작업에서 시간을 절약하고, 보다 나은 성과를 거두길 바랍니다!