작성일자 : 2023-08-28
수정일자 : 2023-10-02
Ver 0.1.2
0. Pandas
- Pandas 는 정형 데이터 분석을 위한 자료구조로 데이터 분석 도구를 제공하는 파이썬 라이브러리이며, Pandas 의 특징은 다음과 같음
- 각각의 행,열에 따라 데이터를 정렬할 수 있는 자료구조
- 시계열, 비시계열 데이터를 함께 다룰 수 있는 통합 자료구조
- 데이터의 결측치값을 유연하게 처리할 수 있는 기능
- 데이터 핸들링 및 특정 행,열의 모든 값을 더하는 등의 데이터 연산 기능
- Numpy (numeric python)을 바탕으로 Excel / SQL / JSON / HTML / CSV와 같은 정형 데이터를 처리하기위해 개발된 2008년에 개발된 *라이브러리
- *라이브러리 : 특정 목적을 수행하는 함수들의 집합
- Pandas 의 자료구조로는 Series와 DataFrame이 있음
- Series는 1차원 데이터를 다루는 데 효과적인 자료구조임
- DataFrame은 행과 열로 구성된 2차원 데이터를 다루는 데 효과적인 자료구조임
import pandas as pd
import numpy as np
1. Series
- pandas의 series로 데이터를 선언할 때 따로 인덱스를 지정하지 않았다면 기본적으로 0부터 시작하는 정수값으로 인덱싱됨
- 아래 예제 처럼 index를 사용자가 지정할 수 있음
- 선언 후 데이터 값을 확인할 때는 values, index를 확인할 때는 index 함수를 이용해서 확인 할 수 있음
- 기본 함수 사용법 : pd.Series(data, index=index)
- Series객체 생성 시 인덱스값을 통해 데이터에 접근할 수 있음
- 파이썬의 리스트와 달리 사용자가 index 값을 지정해 줄 수 있으며, 지정한 index 값으로 데이터에 접근 할 수 있음
s1 = pd.Series([1,2,3])
s1
0 1
1 2
2 3
dtype: int64
s2 = pd.Series(["a","b","c"])
s2
0 a
1 b
2 c
dtype: object
s3 = pd.Series(["a",1,"b",2])
s3
0 a
1 1
2 b
3 2
dtype: object
s4 = pd.Series(["a","b","c"], index=[1,2,3])
s4
1 a
2 b
3 c
dtype: object
s5 = pd.Series([1,2,3],["a","b","c"])
s5
a 1
b 2
c 3
dtype: int64
s5.values
array([1, 2, 3])
s5.index
Index(['a', 'b', 'c'], dtype='object')
s6 = pd.Series([1,2,3,4])
s6
0 1
1 2
2 3
3 4
dtype: int64
s6.index = ("a", "b", "c", "d")
s6
a 1
b 2
c 3
d 4
dtype: int64
1.1 Series 기본 함수
s7 = pd.Series([1,1,1,4,5,6,7,8,9,9,np.NaN])
s7
0 1.0
1 1.0
2 1.0
3 4.0
4 5.0
5 6.0
6 7.0
7 8.0
8 9.0
9 9.0
10 NaN
dtype: float64
s7.size #개수 반환
11
len(s7)
11
s7.count() #NaN을 제외한 개수를 반환
10
s7.shape() #tuple 형태로 shape 반환
a1 = np.array(s7)
a1
array([ 1., 1., 1., 4., 5., 6., 7., 8., 9., 9., nan])
print(a1.mean())
print(s7.mean()) #NaN을 제외한 평균 반환
nan
5.1
s7.unique() #유일한 값만 array 형태로 반환
array([ 1., 4., 5., 6., 7., 8., 9., nan])
s7.value_counts() #NaN을 제외하고 각 값들의 빈도를 반환
1.0 3
9.0 2
4.0 1
5.0 1
6.0 1
7.0 1
8.0 1
dtype: int64
1.2 Series 연산
- Series와 스칼라의 연산은 각 원소별로 스칼라와의 연산이 적용
- Series끼리의 사칙연산도 가능함. 단, index별로 계산이 되는 점을 유의하여야 함
s1 = pd.Series([1,2,3,4,5],["a","b","c","d","e"])
s2 = pd.Series([2,2,2,2,2],["a","b","c","d","e"])
print(s1)
print(s2)
a 1
b 2
c 3
d 4
e 5
dtype: int64
a 2
b 2
c 2
d 2
e 2
dtype: int64
s1*3
a 3
b 6
c 9
d 12
e 15
dtype: int64
s1 + s2
a 3
b 4
c 5
d 6
e 7
dtype: int64
s1["f"] = 100
s2["f"] = 200
print(s1)
print(s2)
a 1
b 2
c 3
d 4
e 5
f 100
dtype: int64
a 2
b 2
c 2
d 2
e 2
f 200
dtype: int64
1.3 Series update
s1 = pd.Series(np.arange(2,13,2),["a","b","c","d","e","f"])
s1
a 2
b 4
c 6
d 8
e 10
f 12
dtype: int64
s1["a"] = 200
s1
a 200
b 4
c 6
d 8
e 10
f 12
dtype: int64
s1.drop("a")
b 4
c 6
d 8
e 10
f 12
dtype: int64
s1
a 200
b 4
c 6
d 8
e 10
f 12
dtype: int64
s1.drop("a", inplace = True) #inplace를 통해 원 데이터 업데이트
s1
b 4
c 6
d 8
e 10
f 12
dtype: int64
1.4 Series selection
- slicing
- 리스트, array와 동일하게 적용
s1 = pd.Series(np.arange(2,11,2),["a","b","c","d","e"])
s1
a 2
b 4
c 6
d 8
e 10
dtype: int64
s1[1:3]
b 4
c 6
dtype: int64
s1 = pd.Series(np.arange(2,21,2),np.arange(10))
s1
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20
dtype: int64
s1 > 10
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
9 True
dtype: bool
s1[s1>10]
5 12
6 14
7 16
8 18
9 20
dtype: int64
(s1 > 10).sum()
5
s1[s1>10].sum()
80
s1 = pd.Series([1,2,3,4,5,np.NaN])
s1
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 NaN
dtype: float64
pd.isnull(s1)
0 False
1 False
2 False
3 False
4 False
5 True
dtype: bool
s1[pd.isnull(s1)]
5 NaN
dtype: float64
pd.notnull(s1)
0 True
1 True
2 True
3 True
4 True
5 False
dtype: bool
s1[pd.notnull(s1)]
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
dtype: float64