# pandas 라이브러리 및 Series, dataFrame 네임스페이스 불러오기
import pandas as pd
# Series 생성
pd.Series()
# 숫자 10을 데이터로 가지고 있는 Series
# 결과 해석
# 왼쪽 0 = 자동으로 생성되는 기본 인덱스 번호(0부터 시작)
# 오른쪽 10 = 입력한 데이터 값
s1 = pd.Series(10)
s1
# 값을 얻을때는 인덱싱이나 슬라이싱을 활용함
s1[0]
# 데이터 내부에 저장된 값 확인
s1.values
# 인덱스 번호 확인
# RangeIndex : 기본적으로 생성되는 인덱스번호를 사용하는 경우 부여
s1.index
# 문자
s2 = pd.Series('abc')
s2
# 데이터 확인
s2.values
# 인덱스 확인
s2.index
# 리스트 자료형
s3 = pd.Series([10, 20, 30])
s3
# 데이터 확인
s3.values
# 인덱스 확인
# 0이상 3미만의 RangeIndex : 0, 1, 2
s3.index
# 데이터 타입이 서로 다른 리스트 자료형
s4 = pd.Series([10.3, 'test', 200, [1, 2, 3]])
s4
# 데이터 확인
s4.values
# 인덱스 확인
s4.index
# 딕셔너리 자료형(자동으로 라벨 부여, key가 index, value가 실제 데이터)
s5 = pd.Series({'a':10, 'b':20, 'c':30})
s5
# 데이터 확인
s5.values
# 인덱스 확인
s5.index
# 숫자인덱스도 병행해서 사용 가능
s5[0]
s5['a']
# 인덱스 새롭게 지정하기
# 인덱스 속성(길이)을 참조하여 리스트, 튜플 타입으로 전달
# 라벨 인덱스가 없던 경우 => 새롭게 라벨 인덱스 부여
# 라벨 인덱스가 있던 경우 => 기존에 있던 라벨 인덱스에 덮어씌우기
s5.index
# 튜플로도 생성 가능
s6 = pd.Series((1, 2, 3, 4, 5.0))
s6
# 인덱스를 새롭게 지정할때는 RangeIndex 범위만큼 길이를 가지는 리스트를 사용
# 행 개수 (데이터 개수)와 동일한 길이를 전달해야 한다.
s6.index =[2018, 2019, 2020, 2021, 2022]
s6
# 인덱스를 지정하여 객체 생성
# 인덱스 객체에 대해서 아이템 참조는 가능
s6.index[3]
s6[2018]
# 인덱스 객체 내부의 단일 라벨 인덱스만 수정하는 것은 불가능
s6.index[-1] = 2023
# 인덱스 라벨링 수정시 전체 인덱스를 대입해줘야 한다
s6.index = [2018, 2019, 2020, 2021, 2023]
s6
# 딕셔너리 없이 시리즈에 라벨인덱스를 부여하고 싶은 경우
# Series() 생성시 index를 파라미터로 줘서 처리할 수 있음
#pd.Series(data, index=[])
s7 = pd.Series([10, 20, 30, 40], index=['mon', 'tue', 'wed', 'thur'])
s7
s7.values
s7.index
# 자동 부여된 숫자 인덱스도 여전히 사용 가능
s7[3]
s7['thur']
# dictionary 자료형으로 Series 생성
data = {'서울':100, '경기':200, '강원':300, '부산':400}
sample = pd.Series(data)
print(data)
print(sample)
# Series 객체와 in 연산자
# dictionary와 유사 : in 연산자를 사용해 내부 요소 검사시
# key값에 해당하는 라벨을 이용해 해당 요소가 있는지 없는지 여부를 True,False로 출력
print('서울' in data) # 딕셔너리 자료형
print('서울' in sample) # Series 자료형
# for문에서 in연산자로 접근 : Series의 value값을 참조
for key in data:
print(key)
print("--------------")
for value in sample.values:
print(value)
# 서울, 경기, 강원, 부산 => 서울, 경기, 강원, 제주로 라벨 인덱싱 변경
# 지정한 index 기준으로 Series 생성
# 사용하는 인덱스에 없는 값은 Series에 NaN값으로 저장
# NaN : Not a Number(결측치) -> numpy에서 해당 위치가 비었음을 의미하는 자료 (null)
# None : 파이썬 기본 자료형에서 값이 없음을 의미하는 자료
index2 = ['서울', '경기', '강원', '제주']
sample2 = pd.Series(data, index=index2)
sample2
s6_data = {'a':10, 'b':20, 'c':30}
s6 = pd.Series(s6_data)
s6
# Series s6의 첫 번째 데이터 =>인덱스 0으로 조회
# Series객체 [인덱스번호 or 라벨숫자]
print(s6.index[0]) #인덱스의 0번째는 'a'
print(s6[0]) #s6자체의 0번째 자료는 10
# Series s6의 인덱스 a에 매칭된 데이터 조회
s6['a']
# 요일 - 자료 매칭 데이터 조회
s7
# Series s7의 인덱스 tue에 해당하는 데이터 값을 변경
# 인덱스(라벨링)은 개별적으로 하나하나 변경 불가능
# 인덱스에 매칭된 데이터는 개별 데이터별 변경 가능
s7['tue'] = 700
s7
# 시리즈에서 원하는 로우(행)만 조회하기 : 조회할 로우명을 리스트로 묶어서 전달
# Series s7에서 wed, mon 라벨 조회
# 이중리스트를 사용해 조회해야함 -> s7['wed', 'mon'] 에러 발생
s7[['wed', 'mon']]
# 여러개의 인덱스를 조회할때는 리스트만 대입할 수 있다.
s7[('mon', 'wed')]
# 인덱스 0에서 인덱스 2(포함)까지 조회
s1 = pd.Series([10, 20, 30, 40 ,50], index=list('abcde'))
s1
# RangeIndex : 0, 1
s1[0:2]
# 라벨 'a'에서 라벨 'c'(c포함)
s1['a':'c']
# 0~ 3범위를 2개 간격으로 인덱싱
s1[0:4:2]
# 인덱스 'b'에서 인덱스 'd'(포함)까지 2개 간격으로 조회
s1['b':'d':2]
# 양수와 음수 데이터를 저장하고 있는 Series 생성
s2 = pd.Series([10, -3, 14, 70, -44, -18, -5, 1, -2, 12, 5])
s2
# 음수인 데이터는 True로, 양수인 데이터는 False로 만들기
s2 < 0
# 위의 조건식에서 음수만 남겨주세요
s2[s2 < 0]
# 두개 이상의 조건 병렬형태로 처리하기
# 양수이면서 10보다 작은 값만 조건식으로 남겨주세요.
s2[(s2 > 0) & (s2 < 10)]
# s1 -> 라벨 : a, b, c, d -> 데이터 4개 [1, 2, 3, 4]
# s2 -> 라벨 : a, c, d, e, f, g -> 데이터 6개 [10, 20, 30, 40, 50, 60]
s1 = pd.Series([1, 2, 3, 4], index=list('abcd'))
s2 = pd.Series([10, 20, 30, 40, 50, 60], index=list('acdefg'))
s1
s2
# Series 객체와 스칼라값의 산술연산
s1 * 3
# Series끼리 더하기
# 공통라벨인 a, c, d에만 값 부여, 어느 한쪽에만 존재하는 라벨들은 NaN
s1 + s2
# fill_value 파라미터 : 공통으로 존재하지 않는 라벨에 대해서 NaN값을
# 적용하지 않고 특정 값으로 대체해서 사용할 수 있다.
# Series 메서드를 사용할 때의 파라미터로 입력 가능
s1.add(s2)
s1.add(s2, fill_value=0)
# Series 객체간의 빼기 연산
s1 - s2
s1.sub(s2, fill_value=100)
# Series 객체 간의 곱하기 연산
s1 * s2
s1.mul(s2, fill_value=1)
# Series 객체 간의 나누기 연산
s1 / s2
s1.divide(s2, fill_value=1)
https://pandas.pydata.org/pandas-docs/stable/reference/series.html
위 사이트에서 추가적인 fill_value 사용 가능 연산자별 명령어를 확인할 수 있다.
import numpy as np
np.random.seed(1021)
data= np.random.randint(1,100,26)
sss = pd.Series(data, index=list('abcdefghijklmnopqrstuvwxyz'))
sss
sss['k']
sss[['a','f','c']]
sss[5:16]
sss['f':'p']
sss[-5:]
len(sss)
sss.size
# 두가지 가능
sss[sss > sss.mean()]
sss == 50
50 in sss
50 in sss.values
(☞゚ヮ゚)☞ 데이터프레임으로 넘어가보자!파이팅!!