1. 개요
Pandas는 강력한 데이터 분석 및 조작 라이브러리로서, 테이블 형태의 데이터를 효율적으로 다룰 수 있는 DataFrame과 1차원 데이터를 위한 Series 객체를 제공합니다. 반면, Numpy는 수치 계산에 특화된 라이브러리로, 다차원 배열을 효율적으로 처리하고 다양한 수학적 함수를 제공합니다. 이 두 라이브러리는 파이썬 데이터 분석 생태계에서 서로 보완적인 역할을 수행하며, 함께 사용될 때 더욱 강력한 시너지 효과를 낼 수 있습니다.
이번 글에서는 Pandas의 DataFrame 및 Series 객체를 Numpy 배열로 변환하는 방법과, 변환된 Numpy 배열을 활용하여 Pandas 데이터를 효율적으로 처리하는 방법을 소개합니다. Numpy의 벡터화 연산, 브로드캐스팅, 유니버설 함수 등을 Pandas 데이터에 적용하여 데이터 분석 성능을 향상시키는 전략을 살펴봅니다.
2. 내용
2-1. Pandas 객체와 Numpy 배열 간 변환
Pandas의 Series와 DataFrame은 내부적으로 Numpy 배열을 기반으로 데이터를 저장하고 관리합니다. 따라서 Pandas 객체를 Numpy 배열로 쉽게 변환하여 Numpy의 강력한 기능을 활용할 수 있습니다.
Series를 Numpy 배열로 변환 (.values)
Pandas Series 객체의 .values
속성을 사용하면 Series의 데이터를 Numpy 배열 형태로 얻을 수 있습니다.
import pandas as pd
import numpy as np
# Series 생성
series_data = pd.Series([10, 20, 30, 40, 50])
print(f"Pandas Series:\n{series_data}")
# Series를 Numpy 배열로 변환
numpy_array_from_series = series_data.values
print(f"\nNumpy 배열 (from Series):\n{numpy_array_from_series}")
print(f"Numpy 배열의 타입: {type(numpy_array_from_series)}")
Pandas Series:
0 10
1 20
2 30
3 40
4 50
dtype: int64
Numpy 배열 (from Series):
[10 20 30 40 50]
Numpy 배열의 타입: <class 'numpy.ndarray'>
DataFrame의 열을 Numpy 배열로 변환
DataFrame의 특정 열을 선택한 후 .values
속성을 사용하면 해당 열의 데이터를 Numpy 배열로 얻을 수 있습니다.
# DataFrame 생성
dataframe_data = pd.DataFrame({
'col1': [1, 2, 3],
'col2': [4.0, 5.0, 6.0],
'col3': ['a', 'b', 'c']
})
print(f"Pandas DataFrame:\n{dataframe_data}")
# 'col2' 열을 Numpy 배열로 변환
numpy_array_from_dataframe_col = dataframe_data['col2'].values
print(f"\nNumpy 배열 (from DataFrame 'col2'):\n{numpy_array_from_dataframe_col}")
print(f"Numpy 배열의 타입: {type(numpy_array_from_dataframe_col)}")
Pandas DataFrame:
col1 col2 col3
0 1 4.0 a
1 2 5.0 b
2 3 6.0 c
Numpy 배열 (from DataFrame 'col2'):
[4. 5. 6.]
Numpy 배열의 타입: <class 'numpy.ndarray'>
DataFrame 전체를 Numpy 배열로 변환 (.values)
DataFrame 객체의 .values
속성을 사용하면 DataFrame의 모든 데이터를 2차원 Numpy 배열 형태로 얻을 수 있습니다. 이때, DataFrame의 열마다 데이터 타입이 다를 경우 Numpy 배열의 데이터 타입은 가장 일반적인 타입으로 자동 변환될 수 있습니다.
# DataFrame 전체를 Numpy 배열로 변환
numpy_array_from_dataframe = dataframe_data.values
print(f"\nNumpy 배열 (from DataFrame):\n{numpy_array_from_dataframe}")
print(f"Numpy 배열의 타입: {type(numpy_array_from_dataframe)}")
print(f"Numpy 배열의 데이터 타입: {numpy_array_from_dataframe.dtype}")
Numpy 배열 (from DataFrame):
[[1 '4.0' 'a']
[2 '5.0' 'b']
[3 '6.0' 'c']]
Numpy 배열의 타입: <class 'numpy.ndarray'>
Numpy 배열의 데이터 타입: <U21
2-2. Numpy로 Pandas 데이터 처리하기
Pandas 객체를 Numpy 배열로 변환하면 Numpy의 강력한 배열 연산 기능을 활용하여 데이터를 효율적으로 처리할 수 있습니다.
Numpy의 유니버설 함수 활용
Numpy의 유니버설 함수(ufunc)는 배열의 각 요소에 대해 element-wise 연산을 빠르게 수행합니다. Pandas Series나 DataFrame의 열을 Numpy 배열로 변환한 후 유니버설 함수를 적용하면, 반복문 없이 효율적인 데이터 처리가 가능합니다.
# Series 생성
price_series = pd.Series([1000, 2000, 1500, 3000])
print(f"가격 Series:\n{price_series}")
# Series를 Numpy 배열로 변환 후 10% 할인 적용
discount_rate = 0.9
discounted_prices_numpy = price_series.values * discount_rate
print(f"\n할인된 가격 (Numpy):\n{discounted_prices_numpy}")
# 결과를 다시 Pandas Series로 만들 수 있습니다.
discounted_prices_series = pd.Series(discounted_prices_numpy)
print(f"\n할인된 가격 Series:\n{discounted_prices_series}")
가격 Series:
0 1000
1 2000
2 1500
3 3000
dtype: int64
할인된 가격 (Numpy):
[ 900. 1800. 1350. 2700.]
할인된 가격 Series:
0 900.0
1 1800.0
2 1350.0
3 2700.0
dtype: float64
Numpy의 집계 함수 활용
Numpy는 np.sum()
, np.mean()
, np.median()
, np.max()
, np.min()
등 다양한 집계 함수를 제공합니다. Pandas Series나 DataFrame의 열을 Numpy 배열로 변환한 후 이러한 함수들을 사용하면 간편하게 통계값을 계산할 수 있습니다.
# DataFrame 생성
score_df = pd.DataFrame({
'math': [90, 85, 70, 95],
'english': [80, 92, 78, 88]
})
print(f"성적 DataFrame:\n{score_df}")
# 'math' 점수의 평균 (Numpy 사용)
math_scores_numpy = score_df['math'].values
mean_math_score_numpy = np.mean(math_scores_numpy)
print(f"\n수학 점수 평균 (Numpy): {mean_math_score_numpy}")
# 'english' 점수의 최댓값 (Numpy 사용)
english_scores_numpy = score_df['english'].values
max_english_score_numpy = np.max(english_scores_numpy)
print(f"영어 점수 최댓값 (Numpy): {max_english_score_numpy}")
성적 DataFrame:
math english
0 90 80
1 85 92
2 70 78
3 95 88
수학 점수 평균 (Numpy): 85.0
영어 점수 최댓값 (Numpy): 92
Numpy의 브로드캐스팅 활용
Numpy의 브로드캐스팅은 크기가 다른 배열 간의 연산을 가능하게 해주는 강력한 기능입니다. Pandas 데이터를 Numpy 배열로 변환한 후 브로드캐스팅을 활용하면, 특정 값이나 배열과의 element-wise 연산을 효율적으로 수행할 수 있습니다.
# DataFrame 생성
sales_df = pd.DataFrame({
'price': [100, 200, 150],
'quantity': [5, 2, 10]
})
print(f"판매 DataFrame:\n{sales_df}")
# 가격에 10% 부가세 적용 (Numpy 브로드캐스팅)
prices_numpy = sales_df['price'].values
vat_rate = 1.1
prices_with_vat_numpy = prices_numpy * vat_rate
print(f"\n부가세 포함 가격 (Numpy):\n{prices_with_vat_numpy}")
# 각 판매 항목의 총액 계산 (Numpy 브로드캐스팅)
price_array = sales_df['price'].values
quantity_array = sales_df['quantity'].values
total_amount_numpy = price_array * quantity_array
print(f"\n총 판매액 (Numpy):\n{total_amount_numpy}")
판매 DataFrame:
price quantity
0 100 5
1 200 2
2 150 10
부가세 포함 가격 (Numpy):
[110. 220. 165.]
총 판매액 (Numpy):
[ 500 400 1500]
2-3. 효율적인 데이터 분석을 위한 전략
Pandas와 Numpy를 함께 사용할 때, Numpy의 성능 이점을 최대한 활용하고 Pandas의 편리함을 유지하는 것이 중요합니다.
벡터화 연산의 중요성
반복문을 사용하여 데이터프레임의 각 행이나 요소에 접근하는 대신, Numpy 배열로 변환하여 벡터화된 연산을 수행하면 코드의 간결성을 높이고 실행 속도를 크게 향상시킬 수 있습니다. Numpy의 유니버설 함수와 브로드캐스팅은 벡터화 연산을 효과적으로 지원합니다.
Numpy를 활용한 조건부 처리
Numpy의 boolean indexing을 활용하면 특정 조건을 만족하는 Pandas 데이터의 하위 집합을 효율적으로 선택하고 조작할 수 있습니다. Pandas Series나 DataFrame의 열을 Numpy 배열로 변환한 후 조건부 로직을 적용하면, 복잡한 필터링 작업을 간결하게 구현할 수 있습니다.
# DataFrame 생성
data_df = pd.DataFrame({
'category': ['A', 'B', 'A', 'C', 'B'],
'value': [10, 25, 15, 30, 20]
})
print(f"데이터 DataFrame:\n{data_df}")
# 'value'가 20보다 큰 행 선택 (Numpy boolean indexing)
value_array = data_df['value'].values
mask = value_array > 20
filtered_df = data_df[mask] # mask를 Pandas Series로 변환하여 사용
print(f"\n'value'가 20보다 큰 행:\n{filtered_df}")
데이터 DataFrame:
category value
0 A 10
1 B 25
2 A 15
3 C 30
4 B 20
'value'가 20보다 큰 행:
category value
1 B 25
3 C 30
3. 결론
Pandas와 Numpy는 파이썬 데이터 분석 워크플로우에서 핵심적인 역할을 수행하는 강력한 라이브러리입니다. Pandas는 고수준의 데이터 조작 기능을 제공하여 복잡한 데이터 처리 작업을 용이하게 만들고, Numpy는 저수준의 배열 연산을 효율적으로 수행하여 데이터 분석 성능을 극대화합니다. 이 두 라이브러리의 장점을 이해하고 효과적으로 함께 사용하는 것은 효율적이고 강력한 데이터 분석 파이프라인을 구축하는 데 필수적입니다.
Pandas 객체를 Numpy 배열로 변환하고, Numpy의 벡터화 연산, 브로드캐스팅, 유니버설 함수를 활용하여 데이터 처리 속도를 향상시키고 코드를 간결하게 만들 수 있습니다. 또한, Numpy의 boolean indexing을 통해 조건부 데이터 처리를 효율적으로 수행할 수 있습니다. 앞으로 데이터 분석 작업을 수행할 때 Pandas와 Numpy의 조화로운 활용을 통해 생산성과 효율성을 높여보시기를 바랍니다.
'Numpy' 카테고리의 다른 글
[Numpy] Numpy로 배우는 기술 통계부터 상관 분석까지 (0) | 2025.05.17 |
---|---|
[Numpy] Numpy로 시작하는 선형대수 - 벡터, 행렬, 그리고 방정식 풀이 (1) | 2025.05.15 |
[NumPy] 값 비교 및 검증 함수 총정리 (isnan, isfinite, allclose, array_equal 등) (0) | 2025.04.19 |
[Numpy] 배열 비교와 조건 필터링 함수 정리 (np.greater, np.where, np.less, np.equal, np.logical_or) (0) | 2025.04.13 |
[Numpy] 배열 연결과 분할 함수 정리 (np.concatenate, np.split, np.stack, np.hstack, np.vstack) (0) | 2025.04.12 |