Pandas
Pandas의 소개
Pandas는 앞으로 가장 자주 살펴볼 라이브러리이다.
고수준의 자료구조와 파이썬에서 빠르고 쉽게 사용할 수 있는 데이터 분석 도구를 포함하고 있다.
Pandas는 다른 산술 계산 도구인 NumPy와 SciPy, 분석 라이브러리인 statsmodels와 scikit-learn, 시각화 도구인 amtplotlib과 함께
사용하는 경우가 흔하다. Pandas는 for 문을 사용하지 않고 데이터를 처리한다거나 배열 기반의 함수를 제공하는 등 NumPy의
배열 기반 뎨산 스타일을 많이 차용했다.
Pandas가 NumPy의 스타일을 많이 차용했지만 가장 큰 차이점은 Pandas는 표 형식의 데이터나 다양한 형태의 데이터를
다루는데 초점을 맞춰서 설계했다는 것이다. NumPy는 단일 산술 배열 데이터를 다루는데 특화되어 있다.
Pandas의 import 컨벤션은 아래와 같이 사용한다.
import pandas as pd
앞으로 pd. 을 보면 pandas를 지칭하는 것으로 이해하면 된다.
Series와 DataFrame은 로컬 네임스페이스로 import 하는 것이 좋으므로 그렇게 사용하겠다.
from pandas import Series, DataFrame
Pandas에 대해 알아보려면 Series와 DataFrame 이 두 가지 자료구조에 익숙해질 필요가 있다.
이 두 가지 자료구조로 모든 문제를 해결할 순 없지만 대부분의 애플리케이션에서 사용하기 쉬우면 탄탄한 기반을 제공한다.
Series
Series는 일련의 객체를 담을 수 있는 1차원 배열 같은 자료구조이다. (어떤 NumPy 자료형이라도 담을 수 있다.)
그리고 index라고 하는 배열의 데이터와 연관된 이름을 가지고 있다.
가장 간단한 Series 객체는 배열 데이터로부터 생성할 수 있다.
in : obj = pd.Series([41,2,-5,6])
obj
out : 0 41
1 2
2 -5
3 6
dtype: int64
Series 객체의 문자열 표현은 왼쪽에 index를 보여주고 오른쪽에는 해당 index의 값을 보여준다.
위 예제에서는 데이터의 색인을 지정하지 않았으니 기본 색인인 정수 0에서 N - 1(N은 데이터의 길이)까지의 숫자가 표시된다.
Series의 배열과 색인 객체는 각각 values와 index 속성을 통해 얻을 수 있다.
in : obj.values
out : array([41, 2, -5, 6], dtype=int64)
in : obj.index # range(4)와 같다.
out : RangeIndex(start=0, stop=4, step=1)
각각의 데이터를 지칭하는 색인을 지정하여 Series 객체를 생성해야 할 때는 다음처럼 한다.
in : obj2 = pd.Series([1,2,3,4], index=['a','b','c','d'])
obj2
out : a 1
b 2
c 3
d 4
dtype: int64
NumPy배열과 비교하자면, 단일 값을 선택하거나 여러 값을 선택할 때 index로 라벨을 사용할 수 있다.
in : obj2['a']
out : 1
in : obj2['b'] = 5 #각각 valuse 변경이 가능하다.
obj2['c'] = obj2['c'] * 2
obj2
out : a 1
b 5
c 6
d 4
dtype: int64
in : obj2 = obj2 * 2 # value 전체에 연산도 가능하다.
obj2
out : a 2
b 10
c 12
d 8
dtype: int64
in : obj2[['d','c','b','a']] # index를 바꿀 수 도 있다.
out : d 8
c 12
b 10
a 2
dtype: int64
여기서 ['d','c','b','a']는(정수가 아니라 문자열이 포함되어 있지만) 색인을 배열로 해석된다.
불리언 배열을 사용해서 값을 걸러 내거나 산술 곱셈을 수행하거나 또는 수학 함수를 적용하는 등
NumPy 배열 연산을 수행해도 index-값 연결이 유지된다.
in : obj2[obj2 > 5] # 비교 연산도 가능하다.
out : b 10
c 12
d 8
dtype: int64
in : np.exp(obj2) # numpy인수로도 가능하다.
out : a 7.389056
b 22026.465795
c 162754.791419
d 2980.957987
dtype: float64
Series를 이해하는 다른 방법은 고정 길이의 정렬된 사전형이라고 생각하는 것이다.
Series는 index값에 데이터 값을 매핑하고 있으므로 파이썬 딕셔너리와 비슷하다.
Series 객체는 파이썬의 딕셔너리를 인자로 받아햐 하는 많은 함수에서 딕셔너리를 대체하여 사용이 가능하다.
in : 'a' in obj2
out : True
in : 'e' in obj2
out : False
파이썬 딕셔너리에 데이터를 저장해야 한다면 파이썬 딕셔너리 객체로부터 Series 객체를 생성할 수 있다
in : sdata = {'seoul':10000, 'busan': 20000, 'suwon': 30000, 'guri': 5000}
obj3 = pd.Series(sdata)
obj3
out : seoul 10000
busan 20000
suwon 30000
guri 5000
dtype: int64
딕셔너리 객체만 가지고 Series객체를 생성하면 생성된 Series 객체의 index에는 사전의 키값이 순서대로 들어간다.
index를 직접 지정하고 싶다면 원하는 순서대로 index를 직접 넘겨줄 수도 있다.
in : states = ['osan','yongin','busan','suwon']
obj4 = pd.Series(sdata, index=states)
obj4
out : osan NaN
yongin NaN
busan 20000.0
suwon 30000.0
dtype: float64
위 예제를 보면 sdata에 있는 값중 2개만 확인이 가능한데, 'osan'과'yongin'에 대한 값은 찾을 수 없기 때문이다.
이 값은 NaN으로 표시가 되괴 pandas에서는 누란된 값, 혹은 NA값으로 취급된다.
'seoul'과 'guri'는 states에 포함되어 있지 않아 실행결과에 빠진다.
NA는 앞으로 누락된 데이터를 지칭하는데 사용하겠다. pandas의 isnull과 notnull함수는 누란된 데이터를 찾을 때 사용한다.
in : pd.isnull(obj4)
out : osan True
yongin True
busan False
suwon False
dtype: bool
in : pd.notnull(obj4)
out : osan False
yongin False
busan True
suwon True
dtype: bool
in : obj4.isnull()
out : osan True
yongin True
busan False
suwon False
dtype: bool
Series의 유용한 기능은 산술 연산에서 index와 라벨로 자동 정렬하는 것이다.
in : obj3
out : seoul 10000
busan 20000
suwon 30000
guri 5000
dtype: int64
in : obj4
out : osan NaN
yongin NaN
busan 20000.0
suwon 30000.0
dtype: float64
in : obj3 + obj4
out : busan 40000.0
guri NaN
osan NaN
seoul NaN
suwon 60000.0
yongin NaN
dtype: float64
데이터 정렬에 대한 내용은 나중에 좀 더 살펴보자.
데이터베이스를 사용해본 경험이 있다면 join연산과 비슷하다고 생각이 들것이다.
Series 객체와 Series의 index 모두 name 속성이 있는데 이 속성은 pandas의 핵심 기능과 밀접한 관련이 있다.
in : obj4.name = 'population'
obj4.index.name = 'state'
obj4
out : state
osan NaN
yongin NaN
busan 20000.0
suwon 30000.0
Name: population, dtype: float64
Series의 index는 대입하여 변경할 수 있다.
in : obj
out : 0 41
1 2
2 -5
3 6
dtype: int64
in : obj.index = ['zero','one','two','three']
obj
out : zero 41
one 2
two -5
three 6
dtype: int64