판다스는 파이썬에서 자료 정제 및 분석을 빠르고 쉽게 할 수 있는 자료 구조와 관리 도구들을 가지고 있다.
NumPy, SciPy
자료 분석 라이브러리: statsmodels, scikit-learn
시각화 도구: matplotlib
판다스는 NumPy 에서 사용되는 배열 기반 연산과
for 문 없이 계산하는 벡터화 계산을 기반으로 한다.
판다스는 이질적인 자료형을 다루는 반면,
넘파이는 동질적인 자료형에 대한 배열을 주로 다룬다.
import pandas as pd
import numpy as np
rng = np.random.RandomState(1234)
판다스와 넘파이 같이 불러온다.
pandas는 데이터 분석을 위한 라이브러리로,
시리즈와 데이터프레임을 제공하여 데이터를 쉽게 조작하고 분석할 수 있다.
numpy는 수치 계산을 위한 라이브러리로, 배열 및 난수 생성 등을 지원한다.
(수치 계산을 위해 numpy 라이브러리도 같이 불러왔다.)
np.random.RandomState(1234)
시드값 1234를 사용하여 난수 생성기를 초기화한다.
이를 통해 재현 가능한 난수 시퀀스를 생성할 수 있다.
시리즈는 연속적인 값들로 이루어진 일차원 배열과 인덱스로 불리는 자료 라벨(label) 배열로 이루어진 객체이다.
리스트로부터 간단한 시리즈를 다음과 같이 만들 수 있다.
obj = pd.Series([-5, 0, 10, 3])
obj
0 -5
1 0
2 10
3 3
dtype: int64
출력된 시리즈에서 왼쪽은 인덱스이고 오른쪽은 값이다.
인덱스를 지정하지 않으면 기본값으로 0부터 N - 1의 숫자가 설정된다.
(예: 0, 1, 2 ... N-1 )
*N: 자료의 갯수
시리즈 객체로부터 인덱스 객체와 값에 대한 넘파이 배열을 얻을 수 있다.
obj.index
RangeIndex(start=0, stop=4, step=1)
obj.values
array([-5, 0, 10, 3], dtype=int64)
종종 각각의 자료에 대응되는 자료 라벨을 직접 지정하여 시리즈를 만드는 것이 바람직할 때가 있다.
obj2 = pd.Series([-5, 0, 10, 3], index=['a', 'b', 'd', 'c'])
obj2
obj2.index
Index(['a', 'b', 'd', 'c'], dtype='object')
넘파이와는 다르게 하나의 값 또는 여러 값들을 선택할 때 라벨을 사용할 수 있다.
obj2['a']
-5
인덱스를 통해서 값을 변경할 수 있다.
데이터프레임이름['행이름'] = 바꿀 값 처럼 적용한다.
obj2['c'] = -12
인덱스 리스트를 통해서 대응되는 값들을 선택할 수 있다.
obj2[['a', 'd', 'c']]
a -5
d 10
c -12
dtype: int64
수학 함수, 스칼로 곱, 논리 배열에 대한 필터링과 같은 넘파이 함수 또는 연산들을 하더라도
인덱스 - 값 연결은 계속 보존된다.
obj2[obj2 < 0]
a -5
c -12
dtype: int64
0보다 작은 값들을 아웃풋으로 보여준다.
obj2 * 2
a -10
b 0
d 20
c -24
dtype: int64
각각의 값들에 2를 곱한 값들을 아웃풋으로 보여준다.
주의사항
원본이 바뀐 것이 아니다.
obj2
a -5
b 0
d 10
c -12
dtype: int64
원 'obj2' 는 바뀌지 않은 것을 알 수 있다.
import numpy as np
np.exp(obj2)
a 0.006738
b 1.000000
d 22026.465795
c 0.000006
dtype: float64
np.exp 함수는 입력된 배열 또는 시리즈의 각 요소에 대해 지수 함수 를 적용한다.
지수 함수는 자연 로그의 밑 e (약 2.718)를 사용하여 계산한다.
시리즈를 사전 형식으로 생각하여
열쇠(key)는 인덱스에, 값은 값에 대응하여 생각할 수 있다.
'a' in obj2
True
obj2에 a가 있다면 True 반환, 없으면 False를 반환한다.
사전형 자료를 다음과 같이 시리즈로 만들 수 있다.
사전형 시리즈 만드는 법
df이름 = {'서울': 9776, '부산':3429} 와 같이 만든다.
시리즈 = pd.Series(df이름) 와 같다.
인구 = {'서울': 9776, '부산':3429, '대전':1531, '세종':276, '충남':2148, '대구':2465}
시리3 = pd.Series(인구)
시리3
대구 2465
대전 1531
부산 3429
서울 9776
세종 276
충남 2148
dtype: int64
사전형 을 시리즈로 만들 때 사전의 열쇠에 대한 정렬 순서로 저장이 된다.
순서를 바꿔 저장하기
열쇠 에 대한 리스트 를 만들어 인덱스에 넘겨주면 된다.
(참고) 열쇠 : 도시들 을 뜻한다. (대전, 세종 ..)
도시들 = ['대전', '세종', '대구', '충남', '인천']
시리4 = pd.Series(인구, index=도시들)
시리4
대전 1531.0
세종 276.0
대구 2465.0
충남 2148.0
인천 NaN
dtype: float64
여기서 인천에 소실값이 나온 것을 확인할 수 있다.
인천 을 제외한 도시들 은 인구 리스트와 적절히 연결되어 값을 설정했다.
반면, 인천은 인구 리스트에 없다.
따라서 NaN (소실값) 을 출력했다.
이 값을 판다스에서는 소실값(missing values)이라고 부른다.
isnull과 notnull 함수isnull 과 notnull 함수들을 이용해 소실 자료들을 찾을 수 있다.
시리4 에 소실값이 있는지 확인한다.
isnull 함수pd.isnull(시리4)
대전 False
세종 False
대구 False
충남 False
인천 True
dtype: bool
소실값(missing values)이 없으면 False를 반환,
반면 소실값이 있으면 True를 반환한다.
notnull 함수: 결측치가 아닌 인덱스 확인pd.notnull(시리4)
대전 True
세종 True
대구 True
충남 True
인천 False
dtype: bool
notnull 에서는 인천만 False 가 나왔다.
시리즈의 인스턴스 메소드로도 접근할 수 있다.
시리4.isnull()
대전 False
세종 False
대구 False
충남 False
인천 True
dtype: bool
시리3과 시리4라는 시리즈를 더해보자.
시리3
대구 2465
대전 1531
부산 3429
서울 9776
세종 276
충남 2148
dtype: int64
시리4
대전 1531.0
세종 276.0
대구 2465.0
충남 2148.0
인천 NaN
dtype: float64
두 개의 시리즈를 더할 때 시리즈1 + 시리즈2 와 같이 더한다.
시리3 + 시리4
대구 4930.0
대전 3062.0
부산 NaN
서울 NaN
세종 552.0
인천 NaN
충남 4296.0
dtype: float64
시리즈 객체와 객체의 인덱스는
판다스의 다른 주요 영역과 통합되는 name 속성을 가지고 있다.
시리4.name = "인구통계"
시리4.index.name = "도시들"
시리4
도시들
대전 1531.0
세종 276.0
대구 2465.0
충남 2148.0
인천 NaN
Name: 인구통계, dtype: float64
도시들의 Name은 Name: 인구통계 으로 나오는 것을 확인할 수 있다.
시리즈 인덱스는 다음과 같이 변경할 수 있다.
인덱스 이름을 ['김', '최', '윤', '홍'] 으로 바꿀 것이다.
obj
0 -5
1 0
2 10
3 3
dtype: int64
obj.index = ['김', '최', '윤', '홍']
obj
김 -5
최 0
윤 10
홍 3
dtype: int64
인덱스가 ['김', '최', '윤', '홍'] 으로 바뀐 것을 알 수 있다.