본문 바로가기
Python/데이터 분석

[pandas] pandas - Series

by snow_white 2022. 4. 2.

1. 시리즈 생성, 구조확인

  • Pandas의 Series는 1차원 배열로서 인덱스(index) 사용 가능
  • 문자 인덱스 사용 가능
  • 데이터 타입 존재 (dtype)
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

#Series? # ndarray 기반의 일차원 배열이다.

ser = Series([1,2,3,4,5])
ser
'''
0    1
1    2
2    3
3    4
4    5
dtype: int64
'''
ser.shape # (5,)

ser = Series([1, '2', 3,0, '네 번째', 5]) # 데이터 타입 맞춰야 하지만 섞어서 입력
ser
'''
0       1
1       2
2       3
3       0
4    네 번째
5       5
dtype: object
'''

ndarray와 같이 series 역시 데이터 타입을 통일해야 하지만

series를 여러 데이터 타입을 섞어서 생성하면 가장 큰 데이터 타입인 str이 아닌 object 형태로 나옴

object가 나온다면 문자열이구나! 알아야 함. 정형 데이터에서는 object 타입이 없기 때문에!

ser = Series([1, '2', 3.0, '네 번째', 5]) # 데이터 타입 맞춰야 하지만 섞어서 입력
ser
'''
0       1
1       2
2       3
3       0
4    네 번째
5       5
dtype: object
'''

# 인덱싱 가능
print(ser[1]) # 2
print(ser[3]) # 네 번째
  • .index ⇒ RangeIndex로 표기됨, 기본 부여된 index는 0~순차적으로 부여되기 때문
  • RangeIndex는 Python list의 Index와는 다르게 -1과 같이 뒤에서 접근할 수 없음 ⇒ 모든 인덱스가 문자인 경우에만 사용 가능

Series 역시 ndarray 기반이기 때문에 index, values로 추출하면 값이 나온다!

ser1 = Series(np.random.randint(10,20,5)) # 10~20 사이의 5개
ser1
'''
0    13
1    19
2    13
3    13
4    11
dtype: int32
'''

# dataframe 은 인덱스가 있다!
# Series에도 있다!
print(ser1.index) # RangeIndex(start=0, stop=5, step=1)

# Series에도 Values가 있다
print(ser1.values) #[18 12 16 12 15]

print(ser1.dtype) # int32 요소들의 타입
  • dtype을 지정한 경우 → numpy 기반이기 때문에 데이터형 확인 가능
  • list로 생성한 경우
s = pd.Series([1,2,3,4,5], dtype='int')
s
'''
0    1
1    2
2    3
3    4
4    5
dtype: int32
'''

arr = np.arange(100, 105)
s = pd.Series(arr, dtype='float64')
s
'''
0    100.0
1    101.0
2    102.0
3    103.0
4    104.0
dtype: float64
'''
  • index 지정 가능
# 인덱스를 명시적으로 지정할 수 있다.

# 5개 추출해서 abcde를 인덱스로 다섯 개 생성
ser1 = Series(np.random.randint(10,20,5), index=list('abcde'))
print(ser1[1]) # 13
print(ser1)
'''
a    12
b    14
c    11
d    12
e    15
dtype: int32
'''

print(ser1.index) # Index(['a', 'b', 'c', 'd', 'e'], dtype='object') => object인 걸 보니 문자열이 있구나!

print(ser1.values) #[[13 10 15 18 10]

print(ser1.dtype) # int32 요소들의 타입
ser1.dtypes # dtype('int32')

series의 shape은 series 데이터 크기와 같다 ⇒ 1차원 데이터이기 때문에 행렬 관계에서 행밖에 없음.. 행렬이 아님..!

ser.shape # (5,)
ser.size # 5
ser1.ndim # 1
  • dtypes : column의 데이터형 확인
ser1.dtypes # dtype('int32')

슬라이싱을 숫자 인덱스말고 라벨링을 할 때는 end까지 포함됨

# 숫자로도 라벨로도 가능
ser1[0]
ser1['a']

'''
라벨 슬라이싱의 경우,
마지막 라벨이 포함된다!
'''
print(ser1[1:4]) # 1 <= a < 4
print(ser1['b':'d']) # 'b' <= a <='d'

# 숫자 인덱스와 문자 라벨링을 섞어 쓰면 에러
~~print(ser1[1:'d'])~~

'''
19
19
b    13
c    15
d    18
dtype: int32
b    13
c    15
d    18
dtype: int32
'''
print(ser1[:2])
'''
a    10
b    14
dtype: int32
'''
print(ser1[::2])
'''
a    10
c    14
e    18
dtype: int32
'''
# 선택한 index list로 인덱싱
i = ['a', 'c']
print(ser1[i])
'''
a    10
c    14
dtype: int32
'''

ser1_1 = ser1[::2]

print(ser1)
print(ser1_1)
'''
a    19
b    13
c    15
d    18
e    11
dtype: int32
a    19
c    15
e    11
dtype: int32
'''

 


2. 시리즈 값 조회하기

단일값을 선택하거나 여러값을 선택할때
1)인덱스로 라벨을 사용할수 있다.
2)슬라이싱 방법
  - 라벨사용 : 마지막 라벨 포함됨 ['a' : 'd']
  - 숫자사용 : 마지막 숫자 포함 안됨

# 5개 추출해서 abcde를 인덱스로 다섯 개 생성
ser1 = Series(np.random.randint(10,20,5), index=list('abcde'))

ser1
'''
a    19
b    13
c    15
d    18
e    11
dtype: int32
'''

ser1.dtypes # 
dtype('int32')

# 숫자로도 라벨로도 가능
print(ser1[0]) # 19
print(ser1['a']) # 19

'''
라벨 슬라이싱의 경우,
마지막 라벨이 포함된다!
'''
print(ser1[1:4]) # 1 <= a < 4
print(ser1['b':'d']) # 'b' <= a <='d'
'''
b    13
c    15
d    18
dtype: int32
'''
print(ser1[:2])
'''
a    19
b    13
dtype: int32
'''
print(ser1[::2])
'''
a    19
c    15
e    11
dtype: int32
'''

ser1_1 = ser1[::2]
ser1_1
'''
a    19
c    15
e    11
dtype: int32
'''

print(ser1)
print(ser1_1)
'''
a    19
b    13
c    15
d    18
e    11
dtype: int32
a    19
c    15
e    11
dtype: int32
'''
  • 시리즈 간의 연산
resSer = ser1+ser1_1
print(resSer)
'''
a    38.0
b     NaN
c    30.0
d     NaN
e    22.0
dtype: float64
'''

 


3. 누락 데이터 조회

  • isnull() , isna() : Nan 값 찾는 함수
  • notnull() , notna() : Nan이 아닌 값 찾는 함수

NaN 값 : pandas에서는 모든 결측치, 누락 데이터는 값이 없다 ⇒ NaN(Not a number), 숫자가 아니라는 의미가 아닌 None 값을 의미!!

int32형 ser1과 int32형 ser1_1을 더하기 연산했을 때 NaN의 영향으로 float형으로 dtype 출력

print(ser1)
print(ser1_1)
'''
a    19
b    13
c    15
d    18
e    11
dtype: int32
a    19
c    15
e    11
dtype: int32
'''

resSer = ser1+ser1_1
print(resSer)
'''
a    38.0
b     NaN
c    30.0
d     NaN
e    22.0
dtype: float64
'''

Nan 값 처리하는 과정

  1. Nan 값, 누락 데이터가 있는지 조회
  • isnull(), isna() ⇒ 누락 데이터가 있는지 True, False 반환
  • notnull() ⇒ 누락 데이터가 없는지

nan 값만 추출

# 1. 조건 찾아서
print(resSer.isnull())
print(resSer.isna())
'''
a    False
b     True
c    False
d     True
e    False
dtype: bool
'''
# 2. 조건 값 처리
print(resSer[resSer.isnull()]) # True(nan 인 경우)를 추출해서 출력
'''
b   NaN
d   NaN
dtype: float64
'''

nan이 아닌 값만 추출

print(resSer.notnull())
'''
a     True
b    False
c     True
d    False
e     True
dtype: bool
'''
print(resSer[resSer.notnull()])
'''
a    38.0
c    30.0
e    22.0
dtype: float64
'''

nan 값의 개수 구하기 sum()

resSer.isnull().sum()  # 2
  1. sum() 으로 누락 데이터 개수
  2. 컬럼별 누락 데이터 구하기
  3. 시각화

heap plot? 그래프 시각화, 누락 데이터가 나타나는 경우만 검은 바탕에 하얗게 표현

정보의 종류

  1. 필수 정보
  2. 선택 정보

누락 데이터는 존재하면 안 됨! 누락 데이터를 제거하여 머신 러닝 학습 진행 필수

함부로 데이터를 제거하면 안 되기 때문에 누락 데이터를 default를

  • 0 이나
  • 평균(mean) 값
  • 100, 1, 2, 3, 4.. 데이터에서 100은 이상치 값으로 평균이 올바르지 않다. 따라서 이상치를 제거하여 중앙값(median)으로 default 설정
  • 최빈값(자주 등장하는 값)으로 설정

Nan 값을 의도적으로 넣어주는 경우

np.nan

4. Pandas를 이용한 시각화

누락데이타가 아닌 데이타를 한눈에 보여준다

import matplotlib.pyplot as plt

resSer[resSer.notnull()].plot(kind='bar') #누락 데이터가 아닌 것만 시각화
plt.show()

댓글