안녕하세요. PSYda 입니다.
Pandas는 2개의 자료구조(Series , DataFrame)를 가지고 있습니다.
Series는 1차원 데이터 구조, DataFrame은 2차원 데이터 구조를 나타냅니다.
이번 포스팅에서는 Series에 대해 아래와 같은 내용을 알아볼 예정입니다.
- Series 데이터의 생성
- Series 데이터의 조회
- Series 산술 연산
- Series 통계
1. Series
Series란?
- 1차원 데이터
- Index 와 Value 로 구성(Python의 사전데이터와 유사)
먼저 Series 나 DataFrame을 사용하기 위해 Pandas 라이브러리를 import 해야합니다.(설치는 이전 블로그를 참고해주세요.)
# pandas library import
import pandas as pd
from pandas import Series, DataFrame
1.1 Series 데이터 생성
- Python 자료형으로 생성가능(리스트, 튜플, 사전)
- numpy array 자료형으로 생성가능
1.1.1 리스트로 Series 생성
data = pd.Series([1,2,3,4])
data
0 1
1 2
2 3
3 4
dtype: int64
1.1.2 튜플로 Series 생성
data = pd.Series((1,2,3,4))
data
0 1
1 2
2 3
3 4
dtype: int64
1.1.3 numpy.array로 Series 생성
import numpy as np
data = pd.Series(np.array([1,2,3,4]))
data
0 1
1 2
2 3
3 4
dtype: int32
위의 3가지 방법으로 생성한 Series 를 보면, Value 값(1,2,3,4)과 index 값(0,1,2,3)으로 저장되는 것을 확인 할 수 있습니다.
index를 key라고 한다면, key와 value로 이루어진 dict(사전) 타입과 비슷하다는 점을 알 수 있습니다.
물론 아래와 같이 사전 타입으로도 생성이 가능합니다.
1.1.4 사전타입으로 Series 생성
data = pd.Series({1:1, 2:2, 3:3 ,4:4})
data
1 1
2 2
3 3
4 4
dtype: int64
1,2,3,4 라는 key값이 index로 저장되고 1,2,3,4 라는 데이터가 value로 저장되는 것을 확인 할 수 있습니다. method를 통해 index와 value 값을 따로 가져 올 수도 있습니다.
# index 값 가져 오기
data.index
Int64Index([1, 2, 3, 4], dtype='int64')
# value 값 가져 오기
data.values
array([1, 2, 3, 4], dtype=int64)
위의 결과들을 보면 "dtype = int64" 라는 구문을 볼 수 있습니다. int형 외에 다른 자료형들도 Series에 저장 될 수 있습니다.
1.1.5 여러 자료형으로 Series 생성
data.dtypes
dtype('int64')
# 여러 자료형으로 Series 생성
data2 = Series(["pandas", "PSY", 34])
data2
0 pandas
1 PSY
2 34
dtype: object
data2.dtypes
dtype('O')
문자열을 포함한 숫자가 아닌 형태의 자료형이 Series에 저장되면 Object type으로 저장 되는 것을 확인 할 수 있습니다.
1.2 Series의 index
- 사전형으로 Series를 생성하면사전형의 key값이 index로 저장
- 사전형이 아닌 데이터로 Series 생성할 때 index를 명시적으로 입력 가능
- 입력값이 없다면 0부터 순서대로 번호를 부여
1.2.1 Series 생성시에 Index명 입력
data3 = Series(["토트넘", "손흥민" , 30], index = ["팀명","선수명","Goal수"])
data3
팀명 토트넘
선수명 손흥민
Goal수 30
dtype: object
data3.index
Index(['팀명', '선수명', 'Goal수'], dtype='object')
1.2.2 이미 생성되어 있는 Series의 index명 변경
data3.index = ["도시명", "사는사람" , "나이"]
data3.index
Index(['도시명', '사는사람', '나이'], dtype='object')
1.3 Series의 조회(색인)
Series의 데이터를 조회하는 기법에 대해 설명하기 위해 Series 하나를 만들어 보겠습니다.
data4 = Series([1,2,3,4,5,6,7,8,9],index = ["서울","대전","대구","부산","광주","전주","충주","마산","성남"])
data4
서울 1
대전 2
대구 3
부산 4
광주 5
전주 6
충주 7
마산 8
성남 9
dtype: int64
1.3.1 index 기준으로 조회
#서울 데이터 조회
data4.at["서울"]
1
#서울, 부산 데이터 조회
data4[["부산","서울"]]
부산 4
서울 1
dtype: int64
# 위에서 부터 2개 Data
data4[0:2]
서울 1
대전 2
dtype: int64
# 끝에서 3개 Data
data4[-3:]
충주 7
마산 8
성남 9
dtype: int64
1.3.2 index 조건 색인
# 서울, 대전 ,대구 데이터 조회
# isin 함수에 인자에 해당하는 index 만 True값을 가지고, True값만 출력
data4[data4.index.isin(["서울","대전", "대구"])]
서울 1
대전 2
대구 3
dtype: int64
1.3.3 조건으로 조회
# 3이상인 데이터만 조회하는 방법
# 1. 각 데이터가 3보다 큰지 확인
data4 > 3
서울 False
대전 False
대구 False
부산 True
광주 True
전주 True
충주 True
마산 True
성남 True
dtype: bool
# 2. True 인 데이터만 조회
data4[ data4 > 3 ]
부산 4
광주 5
전주 6
충주 7
마산 8
성남 9
dtype: int64
1.4 Series의 산술 연산 및 통계
1.4.1 상수와의 연산
# data4의 모든 데이터에 10 더하기
data4 + 10
서울 11
대전 12
대구 13
부산 14
광주 15
전주 16
충주 17
마산 18
성남 19
dtype: int64
# add 함수를 이용해 더하기
data4.add(10)
서울 11
대전 12
대구 13
부산 14
광주 15
전주 16
충주 17
마산 18
성남 19
dtype: int64
1.4.2 Series 끼리의 연산
- 두 Series의 같은 index 끼리 연산함
- 같은 index가 없을 경우 NaN으로 저장됨
연산을 위해 새로운 Series 생성
data5 = Series([10,20,30],index = ["서울","대전","대구"])
data5
서울 10
대전 20
대구 30
dtype: int64
data6 = data4 + data5
data6
광주 NaN
대구 33.0
대전 22.0
마산 NaN
부산 NaN
서울 11.0
성남 NaN
전주 NaN
충주 NaN
dtype: float64
위의 과정을 보면 Series끼리의 연산이 어떻게 동작되는지 알 수 있습니다.
첫 번째로 두 Series의 Index명이 동일하면 연산을 수행합니다. 그 예시로 첫 번째 Series의 "서울", "대전", "대구" 의 데이터와 두 번째 Series의 "서울", "대전", "대구" 의 데이터가 합해지는 것을 볼 수 있습니다.
두 번째 과정을 보면 두 Series에서 동일한 Index가 없는 경우 NaN이 됩니다.
NaN은 데이터가 없다는 뜻으로 타언어의 Null과 동일한 개념입니다.
1.5 NaN 데이터 처리
- fill_value 옵션 : NaN 데이터를 입력값으로 적용후에 함수 적용
- fillna 함수 : NaN값을 입력값으로 변경
add와 같은 산술연산함수를 적용할 때 fill_value 옵션을 적용하면 NaN이 발생할 경우 특정 값으로 대입할 수 있습니다.
data4.add(data5, fill_value = 0)
광주 5.0
대구 33.0
대전 22.0
마산 8.0
부산 4.0
서울 11.0
성남 9.0
전주 6.0
충주 7.0
dtype: float64
Series에 NaN값이 있을 경우 fillna를 이용해 NaN을 입력값으로 변경할 수 있습니다.
# fillna를 통해 NaN값을 특정값으로 할당
data6.fillna(0)
광주 0.0
대구 33.0
대전 22.0
마산 0.0
부산 0.0
서울 11.0
성남 0.0
전주 0.0
충주 0.0
dtype: float64
1.6 통계
- describe 함수 : 주요 통계 정보 보기
- mean 함수 : 평균 구하기
- std 함수 : 표준편차 구하기
# 데이터 통계 정보 보기
data4.describe()
count 9.000000
mean 5.000000
std 2.738613
min 1.000000
25% 3.000000
50% 5.000000
75% 7.000000
max 9.000000
dtype: float64
# 평균 구하기
data4.mean()
5.0
# 표준 편차 구하기
data4.std()
2.7386127875258306
위의 Jupyter notebook 내용은 여기 Github에서도 확인 할 수 있습니다.
감사합니다.
'데이터 분석 > Pandas' 카테고리의 다른 글
[Pandas 기초]6.Pandas DataFrame 산술 연산 (2) | 2019.08.22 |
---|---|
[Pandas 기초]5.Pandas 데이터 파일 입출력 (3) | 2019.08.20 |
[Pandas 기초]4.여러 DataFrame 연결하기(Join) (0) | 2019.08.17 |
[Pandas 기초]3.Pandas의 자료구조-DataFrame (0) | 2019.08.15 |
[Pandas 기초]1.Pandas 란 무엇인가? (0) | 2019.08.13 |