개요
AI 활용 도구에 필수로 쓰이는 데이터 가공 Python 라이브러리들(Numpy, Pandas)을 정리 해두려 한다. Pandas는 데이터를 읽고, 정리하고 탐색하는데 이용하고 NumPy는 정리된 데이터(숫자)를 계산하는데 이용한다.
NumPy
Python의 기본 List는 결국에 값의 주소를 참조하기에 성능적으로 느릴 수 밖에 없는 구조였다. 이러한 단점을 보완하기 위해 데이터를 값을 직접 관리하는 ndarray(배열)를 사용하기 위한 라이브러리이다.
ndarray
위에 설명한 배열구조로 내부 연산은 C로 구현되어 있다. 내부에는 mean, sum, max와 같은 통계함수도 있으며 dtype과 shape정보까지 가진다.
( dtype = 데이터타입 int64,float64 등등 / shape = 배열의 차원별 크기를 튜플 형태로 반환하는 속성 )
- 배열 초기화 및 연산 방식
import numpy
# 리스트(파이썬)와 배열(Numpy)의 차이
py_list = [1, 2, 3]
print(py_list * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3] == 이어 붙이기
np_array = numpy.array([1, 2, 3])
print(np_array * 3) # [3 6 9] == 원소별 3배
print(np_array.dtype, np_array.shape) # dtype(데이터타입) == int64 // shape(2차원 구조) == (3,)
# Numpy 배열 생성
print(numpy.arange(5)) # [0 1 2 3 4]
print(numpy.zeros(4)) # [0. 0. 0. 0.]
print(numpy.ones(3)) # [1. 1. 1.]
print(numpy.linspace(0, 3, 5)) # [0. 0.75 1.5 2.25 3.]
- 통계, 조건 필터, 정렬
import numpy as np
price = np.array([8000, 4500, 52000, 500, 6600])
print(price.sum()) # 71600 총 가격
print(price.mean()) # 14320.0 평균 가격
print(price.max()) # 52000 최고 가격
print(price.std()) # 표준편차
# 조건 필터: 범위 지정은 각 조건을 괄호로 감싸고 &(=and) |(=or)로 결합
print(price[price >= 20000]) # [52000]
print(price[(price >= 5000) & (price <= 10000)]) # [8000 6600]
# 정렬
print(np.sort(price)) # [ 500 4500 6600 8000 52000]
print(np.sort(price)[::-1]) # [52000 8000 6600 4500 500] 내림차순
print(np.argsort(price)) # [3 1 4 0 2] == 작은 값부터의(졍렬될) 인덱스
- 2차원 배열
기본적으로 파이썬에서 사용했던 2차원 List 초기화 방법과 유사한 것과, reshape 메서드로 모양을 바꿀 수 있다.
( reshape에서 인자에 한쪽 차원에 -1를 넘겨줄 경우 남은 크기에 맞춰서 배열을 생성해준다. )
sheet = np.arange(6).reshape(2, 3) # [[0 1 2]
# [3 4 5]]
sheet.T #zip과 같은 효과 # [[0 3]
# [1 4]
# [2 5]]
sheet.sum(axis=0) # [3 5 7], 열별 합
sheet.sum(axis=1) # [3 12], 행별 합
브로드캐스팅이란 특성으로 모양이 다른 배열끼리 연산할 땐 작은 쪽을 자동으로 늘려 맞춰준다.
Pandas
표 형태의 데이터(DataFrame, Series)를 쉽게 다루고 조작할 수 있는 라이브러리로 내부적으로 NumPy 배열을 활용한다.
DataFrame
행과 열로 구성된 2차원 표로 열마다 다른 자료형을 사용할 수 있다.
| 메서드 명 | 용도 | 반환 타입 |
|---|---|---|
| dataframe.head(n) | 위에서 부터 n행 미리보기 (기본 5행) | DataFrame |
| dataframe.tail(n) | 아래에서 부터 n행 미리보기 | DataFrame |
| dataframe.info() | 필드, 자료형, 결측 요약 | 문자열 |
| dataframe.describe() | 필드 통계(count,mean,std,min,max) | DataFrame |
| dataframe.shape | 전체 크기 확인 | Tuple (row, column) |
| dataframe.dtypes | 각 필드별 자료형 | Series |
| dataframe[‘column’].value_counts() | 값별 빈도 | Series |
import numpy
import pandas
n = 200
# 랜덤 값 200개 생성
local = numpy.random.choice(["전주", "울산", "대전", "서울"], n)
menu = numpy.random.choice(["아메리카노", "카페라떼", "바닐라라떼", "프라푸치노"], n)
price = numpy.random.choice([4000, 4500, 5000, 5500, 6000], n)
count = numpy.random.randint(1, 5, n)
df = pandas.DataFram({"local": local, "menu": menu, "price": price, "count": count})
rows, columns = df.shape
print("행:", rows, "| 열:", columns) # 행: 200 | 열: 5
df.info() # 컬럼, 자료형, 결측 요약
- 조건 필터
dataframe[조건]의 형태로 NumPy와 동일한 방식으로 사용한다.
# 조건 필터: 범위 지정은 각 조건을 괄호로 감싸고 &(=and) |(=or) 로 결합
dataframe[(dataframe["local"] == "서울") | (dataframe["local"] == "전주")] # 필터링 (비교 연산자 우선을 위해 괄호 필수)
dataframe.head() # 상위 5개 확인
- 추가 조회 메서드와 loc / iloc 인덱싱
loc는 Location의 약자로 이름을 기준으로 행이나 열 데이터를 선택하는 걸 의미한다.iloc는 integer Location을 의미하며 기존 인덱스 방식과 똑같다.
| 메서드 명 | 동작방식 |
|---|---|
| dataframe.nlargest(n, ‘column’) | 해당 컬럼 기준 상위 n행 |
| dataframe.nsmallest(n, ‘column’) | 해당 컬럼 기준 하위 n행 |
| dataframe.sample(n, random_state=42) | 무작위 n행 (seed 고정 가능) |
| dataframe.sort_values(‘column’, ascending=False) | 컬럼 기준 정렬 |
| dataframe.loc[dataframe[“column”] == n, “another column”] | 필드명이 n인 조건의 다른 필드만 추출 |
| dataframe.iloc[0, 1] | [행, 열]의 위치 값 조회 |
- Group By 집계
이전에 배웠던 SQL 속 사용처와 동일하게 집계 함수(sum, mean, count)를 적용하여 필드별 결과 요약에 사용한다.
print(dataframe.groupby("menu")["price"].mean())
# 메뉴별(필드) ["아메리카노", "카페라떼", "바닐라라떼", "프라푸치노"]
# 평균가격을 반환함
#[출력]
#menu
#바닐라라떼 4954.848412
#아메리카노 5332.542634
#카페라떼 5506.532371
#프라푸치노 4802.225262
#Name: price, dtype: float64
- Pivot Table
엑셀에 있는 그 기능과 동일하게 여러 필드명에 따라 값을 집계하는 테이블을 만든다.
( agg() 함수와 마찬가지로 여러 요소들을 한번에 계산 가능하다 )
pivot = dataframe.pivot_table(index ="local", columns="메뉴", values="price", aggfunc="sum")
#menu 바닐라라떼 아메리카노 카페라떼 프라푸치노
#local
#전주 202500 207000 470000 162000
#울산 235000 287500 220000 250500
#대전 313500 316000 131000 210500
#서울 309000 261500 178000 310500
한줄 평
- 데이터 전처리, 가공 과정이 SQL이 많이 생각나는 공부였다.