본문 바로가기
이것저것

판다스 라이브러리 Series

by 문자메일 2019. 3. 12.


serTest2 - Series 생성하기!

import pandas as pd

import numpy as np


myList = [10,20,30,40] #1차원

d = {'aa':10,'bb':20,'cc':30} #1차원

t = (10,20,30,40) #1차원


sr = pd.Series(myList, dtype=np.int32) #Series 생성하기, List 가능

sr


sr1 = pd.Series(d) #Series 생성하기, Dictionary 가능

sr1

sr2 = pd.Series(t) #Series 생성하기, Tuple가능

print(sr2)

print(sr2[1])


sr = pd.Series(myList, index=['a','b','c','d'], dtype=np.int32, name = "byb")

sr.shape

print (sr.values)


serTest3 - Series 멤버속성

import pandas as pd

import numpy as np


if __name__ == '__main__':

    data = {'aa':10, 'bb':20, 'cc':30}

    sr=pd.Series(data)

    print(sr.index) #Series 인덱스

    print(sr.values) #Series 값

    print(type(sr.values), sr.index)

    print(sr.dtype, sr.ftype) #Series 데이터 타입

    print (sr.shape)

    print(sr.ndim) #Series 차원

    print(sr.strides)

    print(sr.base)

    print(sr.blocks) #Series -> Dictionary 전환


※ 파이썬 딕셔너리와 Pandas Series의 공통점, 차이점

Index와 value를 가진다는 점에서 key와 value를 가지는 파이썬 딕셔너리와 유사하다 볼 수 있다.

그렇기에 파이썬 딕셔너리를 통해 Series를 생성할 수 있다.


딕셔너리에서 key값을 이용해 value를 조회하듯 Series에서 index를 이용해 value를 조회할 수 있다.


딕셔너리와 Series의 차이점은, 딕셔너리의 Key는 순서가 없고 pandas Series의 index는 순서가 있다는 점이다.

그렇기에 Series는 index의 순서를 통해서도 value 조회가 가능하다.


Pandas Series에서는 Series * 1000 같은 요소별 연산을 지원한다.



serTest4 - Series 인덱스 접근법

import pandas as pd

d = {'a':3,'b':4,'c':5,'d':6,'e':7}

sr = pd.Series(d)

print (sr[0:4:2]) #인덱스 슬라이싱 가능

print (sr[[0,2,3]]) #인덱스에 리스트 줄 수 있음

print (sr [['a','d']]) #인덱스에 키값 리스트 줄 수 있음

#sr.index = [1,2,3,4,5]

print(sr)

print (sr[1]) #index가 숫자일 때는 index값으로 찾는다. zero-base가 아닐 때

print (sr['a']) # index명으로 조회

print (sr.iloc[4]) #zero base

print (sr.loc['a']) # search to key value


serTest5 - Series 연산

import pandas as pd
import numpy as np

data = {'aa':10, 'bb':20, 'cc':30, 'dd':40, 'ee':50}
sr = pd.Series(data, name='국어점수')
print(sr)

print(type(sr.loc['aa']))
print(sr+1) #sr.values에 1을 더한다. 원본 수정 X


data1 = {'aa':10, 'bb':20, 'cc':30, 'dd':40, 'ee':50}

sr1 = pd.Series(data1, name='국어점수')

sr + sr1 # Series와 Series를 더할 수 있음, 연산하는 시리즈의 key 값이 다르면 연산 정상 동작 안함


salalry = pd.Series([1000,2000,3000,4000])

print(salalry*0.967) #Series.values에 곱연산

li = [1000,2000,3000,4000]

print([n*0.967 for n in li])


#boolean index

print(sr[ ['aa','dd'] ]) # [True, False, False, True, False] 와 같음

print(sr[ [True, False, False, True, True]])

print(sr [sr >= 30]) #boolean index와 동일함, # [False, False, True, True, True] 와 같음


#논리연산자 (and ==> &, or ==> |, not ==> ~)

#주의해야 할 사항, &연산자가 우선순위가 더 높기 때문에 괄호 해주어야 함

sr[ (sr >= 30) & (sr <= 50)] 

sr[ ~(sr==30) ] #앞에건 논리연산에서의 not, sr [ sr!= 30]은 관계연산자에서의 not


print (sr.isin([10,30])) #boolean index된 값, 해당 Series에 지정한 Value가 있다면 True 리턴

print(sr [ ~sr.isin([10,30]) ])


sr.index.isin(['aa','dd']) #해당 Series의 index 안에 지정한 값이 있다면 True 반환, isin안에는 list값을 주어야 한다

print(type(sr))

print(type(sr.index))


serTest6, 7 - Series 값 수정, 추가, 삭제, 정렬

import pandas as pd

import numpy as np


data = {'aa':10, 'bb':20, 'cc':30, 'dd':40, 'ee':50}

sr = pd.Series(data, name='국어점수')

print(sr)


sr[0] = 100

sr.iloc[0] = 120

sr.loc['cc'] = 3000 # 존재하던 key값이면 value 수정

sr.loc['ff'] = 4 #존재하지 않던 key값이면 신규 key - value로 추가

sr['abc'] = 9

print(sr)

sr[1:4] = sr[1:4]+5

sr[sr>30] = 5 #모든 sr.values에 대하여 비교 연산하여, True인 부분에 값 5로 수정

print (sr)


# newSr = sr.append(pd.Series([1,2,3], index=['gg','hh','ii'])) #기존 Series를 변형하는것이 아니라 새로운 Series객체를 만들어 반환함

# print(newSr)


#Series에서 drop은 index로만 가능하다

deletedSr = sr.drop('aa', inplace=True) # inplace 값이 True인 경우 변경된 값을 새로운 시리즈를 만들어서 반환하는 것이 아니라,

                                        #원본 시리즈에서 바로 변경하고 값을 따로 반환하지 않는다

#deletedSr = sr.drop('aa')

print(sr)

print(deletedSr)


#del은 파이썬 내장 함수

del (sr['bb'])

print(sr)


# 정렬

data = {'aa':10, 'bb':20, 'cc':30, 'dd':40, 'ee':50}

sr = pd.Series(data, name='국어점수')


print (sr.sort_values(ascending=False)) #ascending 인자를 사용하여 오름차순, 내림차순 선택 가능, quicksort사용

print (sr.sort_index(ascending=True))


serTest 8 - Series 데이터 검색(정규표현식)

#데이터 검색에 관하여
import pandas as pd
import numpy as np

sr = pd.Series(['apple', 'kiwi', 'banna', 'apply'])
sr.index = ['ab','cd', 'ef', 'gh']
sr


sr.index.str # <pandas.core.strings.StringMethods at 0x26e14c43b70>

sr.str


sr.str.contains('kiwi') #boolean indexing

sr [ sr.str.contains('app') ] #문자열 검색


sr = pd.Series(['applei', 'kixi', 'banna', 'apply'])

print(type(sr))

sr.index = ['ab','cd', 'ef', 'gh']


print(sr [ sr.str.contains('[ew]i') ]) #정규식 패턴

print(sr [ sr.str.contains('[a-z]i') ]) #정규식 패턴

print(sr [ sr.str.contains('^a.+i$') ]) #regex = False인 경우에는 정규표현식이 아니라 정확한 단어를 찾는다는 의미임


sr2 = pd.Series(['김철수', '이순신', '이이', '이황', '김이', '박김이'])

sr2 [ sr2.str.contains('^김')]

sr2 [ sr2.str.contains('[김이]이')]

sr2 [ sr2.str.contains('[가-힣]이')] #알파벳 a-z와 같은 의미


serTest 9 - 통계관련 멤버함수

#통계관련 멤버함수

import pandas as pd

import numpy as np


import matplotlib.pyplot as plt


data = {'aa':10, 'bb':20, 'cc':30, 'dd':40, 'ee':50}

sr = pd.Series(data, name='국어점수')

print(sr)

sr.min()

sr.idxmin()

sr.max()

sr.idxmax()

sr.head()

sr.tail()


type(sr[sr>=30])

sr[sr>=30].max()

sr[sr<=30].mean()

sr.cumsum()

sr.median()

sr.std() # 표준 편차. 편차가 작을 수록 값이 모여있고, 클 수록 벌어져 있는 것

sr.quantile([0.2,0.5,0.9]) #20%, 50%, 90% 해당되는 값


# for n in sr:

#     print(n)

# for n in sr.index:

#     print(n)

# for idx,v in sr.items():

#     print(idx,v)

# sr.to_excel( r'e:\a.xlsx')#제어 코드의 의미를 없에 주기 위하여 앞에 r을 붙임, Series를 excel에 바로 저장 


sr.plot('line')

sr[sr>=30].plot('bar')

plt.show()


sr.apply(lambda n: n+1 if n<=30 else n+2 )


#윗 줄과 같은 의미

def fn(n):

    return n+1 if n<=30 else n+2

sr.apply(fn)


serTest 10 - 종합내용

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus']=False

sr = pd.Series ([90,90,55,60,76,80,76,88,30,25], name="국어점수")
sr.index = ['홍길동', '이순신', '임꺽정', '정난정', '이이', '이황', '정도전', '김철수1', '김철수2', '김철수3']

# sr.plot(kind='bar')
# plt.show()

#print(sr == sr.max())
# print(sr.idxmax())
# print(sr[sr>=80])


#print(sr[sr<=80] & sr[sr>=50])  #Series와 Series는 논리 연산이 되지만 [sr<=80]는 list 자료형이기에 논리 연산이 안된 결과가 나왔다
# print (type([sr<=80]))
# print ([sr>=50])
# print (type(sr>=50))
# print (sr<=80)

#sr.str #리스트 안의 데이터가 지금처럼 문자열이 아닌 경우는 에러가 난다. - 애초에 안되는 것


#sr[ (sr>=50)&(sr<=80) ]
# sr[sr.index.str.contains('^김')] # 문자열을 검색할 때만 정규표현식으로 쓰는 것, 숫자는 사용 안함

# sr.mean()
# sr.sum()
# sr.std()

# #newsr = sr[sr>40]
# #print(newsr)
# sr.drop(sr[sr<=40].index)#, inplace=True

# sr[sr>=50] = sr[sr>=50]*1.1
# #sr.apply(lambda n: n*1.1 if n>=50 else n) #원본에 바로 적용 안됨
# print(sr.sort_values(ascending=False)[:5])
# sr[sr>=50].plot(kind='bar')
# plt.show()

# sr.value_counts() #데이터가 각각 몇개씩 있는지 Series로 알려줌

# sr.hist(bins=7) #7개의 계급으로 나눠라 == 도수분포표
# plt.plot()
# pd.cut(sr, 7).value_counts()

# print (sr.unique()) #중복된값 제거

#13. 이름순으로 정렬
sr.sort_index()

#14. 키보드로 입력받아 검색된 이름의 점수를 구하시오, 
# name = input("name")
# sr.loc[name]

#15. 데이터를 다음과 같이 출력하시오
print('='*30)
print('%10s%10s'%('이름','국어'))
print('='*30)
for idx,v in sr.items():
    print("%10s%10d"%(idx,v))


#16 국어 점수 50점이하는 가산점 20%를 부여하고, 국어 점수 50점초과는 가산점 10%를 부여하시오.
sr = sr.apply(lambda n : n*1.2 if n<=50 else n*1.1)
print (sr)

#17. 국어점수 10%, 50%, 90%에 해당하는 값을 구하시오.
print (sr.quantile([0.1,0.5,0.9]))

#18. 국어점수를 5개 점수대로 분할한경우 각 도수를 구하시오
pd.cut(sr,5).value_counts()


댓글