🚦 Summary
- Pandas 기초 톺아보기 시리즈 두번째 포스팅입니다.
- Series 데이터의 크기, 모양, unique값, 값의 개수, 값들의 빈도를 확인하는 방법을 정리합니다.
- 그외에 다양한 산술연산방법과 indexing을 통합 Series 요소의 접근방법과 head, tail함수 사용법을 정리합니다.
📌 Intro.
-
Series에서 사용할 수 있는 다양한 함수에 대해 정리합니다.
-
이 방법들을 알면 Series에 담겨 있는 데이터에 대해 다양한 정보들을 파악할 수 있습니다.
Series에서 사용할 수 있는 다양한 함수 정리
- size : Series의 개수 return
- shape : Series의 shape를 튜플형태로 return
- unique: Series에서 유일한 값(중복 제거)이 무엇이 있는지 ndarray로 return
- count : Series에서 NaN을 제외한 값의 개수를 return
- mean: Series에서 NaN을 제외한 값들의 평균을 return(int, float등 숫자형 데이터에만 적용)
- value_counts: Series에서 NaN을 제외하고 각 값들의 빈도를 return (숫자형, 문자형 상관없이 모두 적용)
—
- 각 기능을 예제코드와 함께 어떻게 작동하는 지를 살펴보겠습니다.
1
2
3
4
5
6
7
8
9
# 필요 라이브러리 불러오기
import numpy as np
import pandas as pd
1
2
3
4
5
6
7
8
9
10
11
12
13
# 마지막 값을 Null로 생성합니다.
# Nan : Not a Number 을 의미합니다.
# 실제 데이터 분석에도 NaN값이 있는 경우가 많기 때문에 NaN값이 있는 데이터를 어떻게 파악하고 처리하는지 확인하기 위함입니다.
s = pd.Series([1, 1, 2, 1, 2, 2, 2, 1, 1, 3, 3, 4, 5, 5, 7, np.NaN]) # 데이터 생성
s # 결과 확인
0 1.0 1 1.0 2 2.0 3 1.0 4 2.0 5 2.0 6 2.0 7 1.0 8 1.0 9 3.0 10 3.0 11 4.0 12 5.0 13 5.0 14 7.0 15 NaN dtype: float64
len : Series 의 길이
-
파이썬 프로그래밍 기초에서 배운 내용이 Series에서도 그대로 적용됩니다.
-
Series가 담고 있는 요소의 총 개수를 return하는 기능입니다.
-
유의할점은 NaN(결측치)도 하나의 요소로 취급하여 출력값에 포함한다는 점입니다.
1
2
3
4
5
print(list(s)) # 전체 Series 확인
len(s)
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
16
- Seires에 nan값이 있음에도 이를 카운트해서 16개로 보여주는 것을 알 수 있습니다.
1
2
3
4
5
6
7
s2 = s.copy() # 차이를 보여주기 위한 샘플
s2.dropna(inplace = True) # nan값을 삭제하는 메서드
len(s2) # 결과출력
15
- 기존 Series에서 nan값을 제외한 뒤에는 len()의 결과가 15개로 출력되는 것을 확인할 수 있습니다.
Series의 크기
-
size는 Series내 전체 요소의 개수를 return합니다.
-
len()과 비슷하지만 size는 Series 객체의 자체 기능이며 함수가 아니라는 차이점이 있습니다.
-
size 또한 len()과 마찬가지로 NaN값을 카운트 합니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.size # 요소 개수 확인
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
16
1
2
3
4
5
print(list(s2)) # NaN을 제거한 Series
s2.size # 요소개수 확인
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0]
15
- len() 과 마찬가지로 NaN을 제거한 Series에 대해서는 15개의 값이 있다고 출력하는 것을 확인할 수 있습니다.
Series의 형태
-
shape는 Series 객체에 저장된 총 요소의 개수를 return합니다.
-
Series는 1차원 데이터구조이기 때문에, return되는 튜플에는 요소의 개수만 포함되어 있습니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.shape # 형태 출력
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
(16,)
Series의 unique한 값
-
unque는 Series에서 중복된 값을 제거하고 유일한 값들만을 array 형태로 return합니다.
-
여기서의 특이사항은 NaN값도 유일한 값으로 간주되어 결과값에 포함될 수 있다는 것입니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.unique()
array([ 1., 2., 3., 4., 5., 7., nan])
Series의 value의 수 (=count)
-
Series에서 count는 NaN값을 제외한 Series 내 요소의 개수를 return합니다.
-
len()이나 size()와의 차이점 입니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.count() # NaN값 제외한 Series내 요소의 개수 확인
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
15
Series의 value_counts
-
value_counts 함수는 Series 내 각 값이 출현하는 빈도수를 계산합니다.
-
기본적으로 NaN은 빈도 계산에서 제외 되지만,
dropna = False
옵션을 함께 사용하면 NaN빈도도 포함시킬 수 있습니다. -
결과는 빈도수를 기준으로 내림차순으로 정렬됩니다.
- 정렬을 바꾸고 싶다면 ascending=True
를 설정해 오름차순으로 변경할 수 있습니다.
1
2
3
s.value_counts()
1.0 5 2.0 4 3.0 2 5.0 2 4.0 1 7.0 1 dtype: int64
Series의 산술연산
-
Pandas의 Series는 다양한 산술연산을 지원합니다.
-
이 연산들은 대부분 NaN(결측치)를 연산에서 자동으로 제외 합니다.
-
이러한 기능은 데이터 분석에서 누락된 데이터를 고려한 정확한 계산을 할 수 있도록 돕는 편리한 기능입니다.
-
하지만 이 연산이 가능하다는 점 때문에 종종 데이터에 결측치가 있다는 것을 잊고 데이터 분석을 하는 경우가 생깁니다.
-
그러므로 항상 Pandas의 연산은 NaN을 자동으로 제외하고 연산한다 는 것을 알고 있어야 합니다.
- array는 NaN값이 있을 경우 연산이 되지 않습니다.
1
2
3
4
5
a = np.array([2, 2, 2, 2, np.NaN])
a.mean()
nan
- 반면에 Series는 NaN이 있을 경우 NaN을 제외한 나머지 값으로 연산을 합니다.
1
2
3
4
5
6
7
print(list(s)) # 전체 Series
print(s.mean()) # NaN이 있는 Series의 mean 연산
s2.mean() # NaN값이 없는 Series에서의 mean 연산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan] 2.6666666666666665
2.6666666666666665
- 위의 mean을 포함해 Pandas의 Seires에서 사용할 수 있는 산술연산의 종류는 아래와 같습니다.
평균(mean)
-
mean 함수는 Series 내의 평균값을 계산합니다.
-
NaN 값은 평균 계산에서 제외됩니다.
-
사용법은 위에서 사용한 예제와 같습니다.
최소값 (min)
-
min 함수는 Series 내의 최소값을 찾습니다.
-
여기서도 NaN 값은 계산에 포함되지 않습니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.min() # Series의 최소값 찾기
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
1.0
최대값 (max)
-
max 함수는 Series 내의 최대값을 계산합니다.
-
NaN 값은 최대값 계산에서 제외됩니다.
1
2
3
4
5
print(list(s)) # 전체 Series
max(s) # Series의 최대값 찾기
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
7.0
합계 (sum)
-
sum 함수는 Series의 값들의 합을 return합니다.
-
NaN 값은 합계 계산에서 제외됩니다.
-
문자열로 된 Series의 경우 모든 문자열이 연결(concatenation) 됩니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.sum() # Series 요소의 모든 합을 구합니다.
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
40.0
1
2
3
4
5
s3 = pd.Series(['a', 'b', 'c', 'd']) # 문자열 Series 만들기
s3.sum() # 문자열 연결
'abcd'
중앙값 (median)
-
median 함수는 Series의 중앙값을 계산합니다.
-
이 계산에서도 NaN 값은 제외됩니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.median() # Series 요소의 중앙값 계산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
2.0
절대값 (abs)
-
abs 함수는 Series의 모든 요소의 절대값을 계산합니다.
-
각 요소의 절대값이 개별적으로 return됩니다.
-
개별 요소의 절대값을 보려면 abs() 안에 Series의 개별 요소의 인덱싱(indexing)한 값을 넣어줘야 합니다.
- 인덱싱(indexing)한 값에 abs()를 적용하는 것(ex : s[1].abs()
는 에러가 발생합니다. 아래에 예시를 제공하겠습니다.)
1
2
3
4
5
print(list(s)) # 전체 Series
s.abs() # Series 모든 요소의 절대값 계산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
0 1.0 1 1.0 2 2.0 3 1.0 4 2.0 5 2.0 6 2.0 7 1.0 8 1.0 9 3.0 10 3.0 11 4.0 12 5.0 13 5.0 14 7.0 15 NaN dtype: float64
1
2
3
abs(s[1]) # 1번째 요소인 1.0의 절대값 구하기
1.0
-
s[1].abs()
는 에러가 발생합니다. -
Series에서 인덱싱(indexing)을 통해 return된 개별 요소는 더이상 Series 객체가 아니라 파이썬의 기본 데이터 타입 또는 Numpy 데이터 타입이기 때문입니다.
1
2
3
s[1].abs()
누적합 (cumsum)
-
cumsum 함수는 Series의 누적합을 계산합니다.
-
NaN 값은 누적합에서 제외되며, 이전 값의 합에 영향을 주지 않습니다.
-
Series내 요소의 모든 값의 합에 대한 결과값만을 return하는 sum과 달리 cumsum은 Series내의 각 요소별 합의 결과를 순차적으로 보여줍니다.
- 이렇게 출력되는 결과는 새로운 Series 형태의 데이터 입니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.cumsum() # Series의 누적합 계산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
0 1.0 1 2.0 2 4.0 3 5.0 4 7.0 5 9.0 6 11.0 7 12.0 8 13.0 9 16.0 10 19.0 11 23.0 12 28.0 13 33.0 14 40.0 15 NaN dtype: float64
누적곱 (cumprod)
-
cumprod 함수는 Series의 누적곱을 계산합니다.
-
특이사항으로 NaN 값은 누적곱에서 1로 간주됩니다.
-
하지만 이는 말그대로 연산이 이뤄지도록 하기 위한 것으로 실제 결과에 영향을 미치지는 않습니다.
-
comsum과 마찬가지로 각 요소별 곱의 결과를 순차적으로 return하며, 이 결과는 별도의 Series 형태의 데이터 입니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.cumprod()
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
0 1.0 1 1.0 2 2.0 3 2.0 4 4.0 5 8.0 6 16.0 7 16.0 8 16.0 9 48.0 10 144.0 11 576.0 12 2880.0 13 14400.0 14 100800.0 15 NaN dtype: float64
표준편차 (std)
-
std 함수는 Series의 표준편차를 계산합니다.
-
NaN 값은 표준편차 계산에서 제외됩니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.std() # Series 전체 요소의 표준편차 계산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
1.8387366263150309
분산 (var)
-
var 함수는 Series의 분산을 계산합니다.
-
NaN 값은 분산 계산에서 제외됩니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.var() # Series 전체 요소의 분산 계산
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
3.380952380952382
최소공배수 (mode)
-
mode 함수는 Series 내에서 가장 자주 등장하는 값을 찾습니다.
-
NaN 값은 모드 계산에 포함되지 않습니다.
1
2
3
4
5
print(list(s)) # 전체 Series
s.mode() # Series 전체의 최소공배수 찾기
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
0 1.0 dtype: float64
상관계수 (corr)
-
corr 함수는 두 Series 간의 상관계수를 계산합니다.
-
이 함수는 두 Series 사이의 선형 관계의 강도를 측정합니다.
1
2
3
4
5
6
7
8
9
print(list(s)) # 전체 Series
print(list(s2)) # 전체 Series
s.corr(s2) # s와 s2의 상관관계
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan] [1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0]
1.0
-
NaN을 제외하고는 모든 요소의 값이 같기 때문에 상관관계가 당연히 1이 될 수 밖에 없습니다.
-
값이 다른 샘플데이터를 만들어서 다시 시도해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 길이가 15인 랜덤한 값으로 구성된 Series 생성
length = 15
random_series = pd.Series(np.random.random(length))
random_series
print(list(s)) # 전체 Series
print(list(random_series)) # 전체 Series
s.corr(random_series) # s와 s2의 상관관계
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan] [0.8015840785303865, 0.005453483300369322, 0.5745111223172886, 0.4918370215535973, 0.1478151507689779, 0.5190110106184694, 0.10120792797267708, 0.38001592607542733, 0.12882417243336652, 0.5180457975464019, 0.5782982515527354, 0.15407029291725383, 0.24316476267899223, 0.10233089871557155, 0.8917142775321586]
0.1891842434201723
자료형 변환 (astype)
- astype 함수는 Series의 데이터 타입을 다른 타입으로 변환합니다.
1
2
3
4
5
6
7
8
9
10
11
print(list(s)) # 전체 Series
str_s = s.astype(str) # 숫자값들을 문자열 데이터로 변경
print(s.sum()) # 숫자일때의 sum
print(str_s.sum()) # 같은 모양을 문자로 변환한 Series의 sum
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan] 40.0 1.01.02.01.02.02.02.01.01.03.03.04.05.05.07.0nan
index를 활용하여 멀티플한 값에 접근하기
-
Pandas Series는 index를 활용해 데이터에 접근할 수 있습니다.
-
이 기능을 잘 활용하면 데이터 전처리, 분석 과정에서 데이터를 효율적으로 추출할 수 있습니다.
단일 값에 접근하기
-
index를 사용해 Series의 특정 요소에 접근할 수 있습니다.
-
예를 들어,
s[5]
는 Series s의 여섯번째 요소(index 5)에 접근합니다. -
이 방식으로 특정 데이터 포인트를 확인하거나 처리할 수 있습니다.
1
2
3
4
5
# index로 단일값에 접근하는 경우
s[5]
2.0
-
다만 이렇게 추출된 데이터는 Series 형태의 데이터가 아니라는 점을 알고 있어야 추가적인 데이터 처리를 할 수 있습니다.
-
단일 값에 접근했을때 추출되는 데이터는 ‘Pandas Series 원소’ 타입 데이터 입니다.
-
이 Pandas Series 원소 타입의 경우 세부 데이터 타입은 실제 Series의 원소를 따릅니다.
- s[5]
에 있는 원소의 데이터 타입이 정수형이라면, return되는 값도 정수형입니다.
- 주의할 점은, 이렇게 return된 데이터는 Series의 메소드를 적용할 수 없다는 것 입니다.
여러값에 동시에 접근하기
-
index의 배열을 사용하면 Series의 여러 요소에 동시에 접근할 수 있습니다.
-
예를들어
s[[5, 7, 8, 10]]
을 사용하면 s Series에서 5,7,8,10번째 index에 해당하는 값들에 접근할 수 있습니다. -
이 방법을 통해 여러 데이터 포인트를 동시에 분석하거나 비교할 수 있습니다.
-
이렇게 접근한 데이터들의 sort_values() 함수를 적용해 값을 도출해 보겠습니다.
1
2
3
4
5
6
7
# 5, 7, 8, 10 번째 index의 값에 대한 value_counts
s[[5, 7, 8, 10]].value_counts()
1.0 2 2.0 1 3.0 1 Name: count, dtype: int64
- 기존에 s 라는 Series에 적용했던 value_counts()와 비교해서 보자면 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 두 value_counts 결과 계산
value_counts_all = s.value_counts().sort_index()
value_counts_selected = s[[5, 7, 8, 10]].value_counts().sort_index()
# 두 결과를 하나의 DataFrame으로 합치기
df = pd.DataFrame({
'All Values': value_counts_all,
'Selected Values': value_counts_selected
})
# NaN 값을 공백으로 처리
df = df.fillna('')
df
All Values | Selected Values | |
---|---|---|
1.0 | 5 | 2.0 |
2.0 | 4 | 1.0 |
3.0 | 2 | 1.0 |
4.0 | 1 | |
5.0 | 2 | |
7.0 | 1 |
Series의 head와 tail
-
Pandas에서 제공하는 head와 tail 함수는 데이터의 상위 또는 하위 일부를 빠르게 살펴보는데 유용합니다.
-
이 함수들은 데이터 탐색이나 전처리 과정에서 굉장히 자주 사용되는 함수입니다.
head 함수
-
head함수는 Series나 DataFrame의 상위 n개 요소를 return합니다.
-
기본적으로 상위 5개의 요소를 return하며, 괄호안에 특정 수를 지정하여 원하는 개수만큼 출력할 수도 있습니다.
- 공식문서에는 괄호안에 n = 숫자 형태로 입력하게 되어 있지만 숫자만 입력해도 동일하게 작동합니다.
1
2
3
4
5
6
7
8
9
print(list(s)) # 전체 Series
s.corr(s2) # s와 s2의 상관관계
s.head(n=7) # Series의 상위 7개 요소 return
[1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 3.0, 4.0, 5.0, 5.0, 7.0, nan]
0 1.0 1 1.0 2 2.0 3 1.0 4 2.0 5 2.0 6 2.0 dtype: float64
1
2
3
s.head(7) # n = 을 쓰지 않아도 동일하게 작동합니다.
0 1.0 1 1.0 2 2.0 3 1.0 4 2.0 5 2.0 6 2.0 dtype: float64
1
2
3
s.head() # Series의 상위 5개 요소 return(기본값)
0 1.0 1 1.0 2 2.0 3 1.0 4 2.0 dtype: float64
tail 함수
-
tail함수는 Series나 DataFrame의 하위 n개의 요소를 return합니다.
-
이 함수 역시 기본적으로 하위 5개 요소를 return합니다.
-
또한, 괄호안에 숫자를 입력해 원하는 개수만큼 return하도록 할 수도 있습니다.
1
2
3
s.tail()
11 4.0 12 5.0 13 5.0 14 7.0 15 NaN dtype: float64
댓글남기기