코린이 유치원/Pandas

[Pandas] 01 Series - 개념, 생성, 인덱싱, 슬라이싱

개나리반 2022. 6. 20. 00:14

 

01 Series 개념

  • 1차원 자료 구조(순서를 한 방향으로만 표현)
  • DataFrame의 한 행이나 한 열을 표현
  • index를 사용하여 접근 가능
    • index는 순번과 지정한 이름 두가지로 구성.
    • index 명을 지정하지 않으면 순번이 index가 됨
    • 순번은 0부터 1씩 증가하는 정수
  • 벡터화 연산(element - wise 연산) 지원
    • Series 객체에 연산을 하면 각각의 series 원소들에 연산이 된다.
  • Series를 구성하는 원소들을 다루는 다양한 메소드 제공  

 

02 Series 생성

구문: pd.Series(배열형태 자료구조)

  • 배열형태자료구조 - 리스트,딕셔너리,튜플,넘파이 배열

 

import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
print(s)

 

 

index명 지정 Series: 딕셔너리로 작성

d = {
    '가':1,
    '나':2,
    '다':3
}
s2 = pd.Series(d)
s2

 

 

index명 지정 Series: 매개변수로 작성

s3 = pd.Series([98, 95, 100, 100, 100], index = ['국어', '영어', '과학', '수학'])
s3

 

Series/Data Frame - index명은 중복가능

s5 = pd.Series(range(10), index = list('AAABBBCCCC))
s5
s5['A'] # A인덱스 지정된 값 모두 조회
S5['A':'B'] # 첫번째 A부터 마지막 B까지
# index명 중복된경우 첫번째 시작 start index명 ~ 마지막 end index명

 

03 Series 접근

01 Indexing

  • index 순번으로 조회
    • Series[순번]
    • Series.iloc[순번]
  • index 이름으로 조회
    • Series[index명]
    • Series.loc[index명]
    • Series.index명
      • index명이 문자열일 경우 .표기법 사용가능
  • 팬시 인덱싱
    • Series[index 리스트]
    • 여러 원소 조회 시 조회할 index를 list로 전달

 

index(순번)으로 조회

print(s3[0], s3[1]) # 양수 index
print(s3[-1], s3[-2]) # 음수 index

 

iloc 인덱싱

print(s3.iloc[0], s3.iloc[1])
print(s3.iloc[-1], s3.iloc[-2])

 

index 이름명 조회

# index 이름명 조회
print(s3['영어'], s3['수학])

# loc 인덱싱
print(s3.loc['국어'], s3.loc['과학'])

# .표기법
print(s3.국어, s3.과학)

 

 

팬시 인덱싱

s3[[0, 1, 2]]

s3[['국어', '수학']]

 

02 Slicing

  • Series[start index: end index: step]
    • start index 생략: 0번 부터
    • end index
      • index 순번일 경우 포함 하지 않는다.
      • index명의 경우는 포함
    • end index 생략: 마지막 index까지 
    • step 생략: 1씩 증가
  • slicing의 결과를 변경시 원ㅇ본도 같이 바뀐다.
  • 시리즈이름.copy(): Series를 복사한 새로운 객체 반환

 

Series[순번] 슬라이싱

s4 = pd.Series(range(10), index = list('abcdefghij'))
s4
s4[3:8] # step 1
s4[3:8:2] # step 2
s4[3:] # 3 ~ 마지막
s4[3::3] # 3 ~ 마지막, step3
s4[:7] # 시작 index 생략 0부터
s4[7:1:-1] # 역순 인덱싱
s4[::-1] # 역순 인덱싱

 

Series[인덱스명] 슬라이싱

s4['e':'j'] # 인덱스명으로 슬라이싱할 땐 end index도 포함해서 조회
s4['j':'e':-2] # 역순 슬라이싱 가능

 

03 Boolean 인덱싱(Masking)

  • Series의 indexing 연산자에 boolean 리스트를 넣으면 True인 index의 값들만 조회
    • Boolean 연산자들을 이용해 원하는 조건의 값들을 조회 가능
    • 다중 조건일 경우 반드시 ( )로 조건 묶기
연산자 설명
& and 연산자
| or 연산자
~ not 연산자

 

bool list로 인덱싱

s3 = pd.Series([70, 20, 100, 200, 50])
bool_index = [True, True, False, False, True]
s3[bool_index] # True와 같은 index 값들 조회

 

조건 검색

s3 >= 100 # bool 값 반환
s3[s3 >= 100] # 100이상인 값만 반환

 

두가지 조건 검색

s3[(s3 >= 50) & (s3 <= 150)] # and 사용 못함 연산자 사용하고 괄호()로 묶기

 

04 shallow copy/deep copy

  • deep copy(깊은 복사)
    • 원본의 카피본을 반환. 값 변경 시 원본은 변경되지 않음
    • 파이썬 리스트는 slicing 시 deep copy
    • indexing은 deep copy
  • shallow copy(얕은 복사)
    • 원본을 반환하여 값 변경시 원본에 영향
    • Series, DataFrame, ndarray는 slicing 조회시 shallow copy
  • copy() 메소드
    • Series, DataFrame, ndarray를 복사하여 반환
import pandas as pd
s1 = pd.Series(range(10, 101, 10))
s1

 

indexing 이용한 값 변경

s3['영어'] = 99
s3[0] = 100
s3

 

팬시 인덱싱으로 값 변경

s1[[1, 4, 7, 8]] = 1000, 4000, 7000, 8000

 

슬라이싱으로 값 변경

s1[:4] = 1234

 

05 벡터화(연산)

  • Elements-wise 연산
  • Numpy 배열(ndarray)와 마찬가지로 Series 객체 연산을 하면 Series 내의 원소 별 연산

Series 연산

import pandas as pd
s2 = pd.Series(range(10))
s2 + 10

 

Series간의 연산

s10 = pd.Series([1, 2, 3])
s20 = pd.Series([10, 20, 30])
s30 = pd.Series([100, 200, 300], index = ['가', '나', '다'])
s40 = pd.Series([1, 2, 3, 4, 5])

s10 + s20 # 연산 가능

s20 > s10 # 대소비교 가능 

s10 + s30 # 인덱스명 다르면 계산 불가

s10 + s40 # 개수가 다르면 길이가 같은 것까지 계산

s10 > s40 # 원소 개수 다르면 대소 비교 불가