Python

[Python] 판다스(pandas)_1. 시리즈(Series) 배열, indexing, slicing, boolean, operator

걍작 2022. 4. 16. 18:11

#정리

#01Series - 시리즈

#한 열을 '시리즈'라고 하며, 시리즈(열)이 모이면 '데이터 프레임'이 된다.

#import pandas as pd
#pandas version check

 -print("pandas version",pd.__version__) 
#시리즈 관련 함수 col = pd.Series([11,22,33,11,22,33,11,22])
 - print(type(col)) #dtype: int64 <class 'pandas.core.series.Series'>
 - print(col.index) #RangeIndex(start=0, stop=3, step=1)
 - print(col.values) #데이터 값 출력
 - print(len(col)) 
 - print(col.size)
#col.value_counts() : 데이터 별 중복 갯수
 - print(col.value_counts())
#col.describe() : 정수 타입 시리즈에 대한 통계
 - print(col.describe()) #갯수, 평균, 표준편차, 중간값, 등..

#col.describe() : 문자 타입 시리즈에 대한 정보
 - print(col.describe()) #정수와는 다른 정보가 나온다.
 - count     8 - 데이터 수
 - unique    3 - 고유 값 수
 - top       a - 비중이 큰 원소 중 선행한 원소
 - freq      3 - top 원소의 중복 수 

#여러 방법으로 시리즈를 생성할 수 있다.
 - col = pd.Series([i for i in range(1,10+1)]) #리스트
 - col = pd.Series(range(1,10+1)) #레인지
 - col = pd.Series(np.arange(1,10+1)) #넘파이레인지
 - col = pd.Series(np.array([i for i in range(1,10+1)])) #넘파이배열
#indexing 값 접근

 - print(col[[3,7]].values) #int32 [4 8]

 - col[1] = col[0] #1번 값을 0번 값으로 변경

 - col[[5,6]] = col[[0,1]] #5,6번 값을 0,1번 값으로 변경
#slicing 값 접근
 - print(col[3:7].values) #int32 [333 444 100 100] >ndarray type
 - print(col[3:7].values[0]) # 333
#비교 연산 가능
 - print((col > 5).values) #조건식에 넣어 각 데이터 별 참/거짓을 반환한다.
 - print(col[col > 5]) #bool indexing 가능 : 조건식이 참인 데이터만 반환한다.
#index를 문자로 변경 가능
 - 인덱스의 형태를 바꿀 수 있다. 
 - col = pd.Series(np.arange(1,10+1),index=[i for i in range(10,10+10)]) #index옵션 추가
 - col = pd.Series(np.arange(1,10+1),index=['A','B','C','D','E','F','G','H','I','J']) #개별 지정 가능
 - col = pd.Series(np.arange(1,10+1),index=[chr(i) for i in range(65,65+10)]) #문자 index가능
 **변경된 index도 인덱싱/슬라이싱 적용이 가능하다.
 - print(col[['A','G']].values) #int32 [4 8]
 - print(col['D':'G'].values) #int32 [4 5 6 7] >ndarray type
#수학 , 통계 함수들 가능
 - print("col.sum():",col.sum()) # 합계
 - print("col.mean():",col.mean()) # 평균
 - print("col.std():",col.std()) # 표준편차
#시리즈 응용
 - print("one_line:\n",pd.Series(x.split('-')[0] for x in phones).value_counts())

#연산함수(add,sub,mul,div)
<col01 + col02>
 - sum_col  = col01 + col02 #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
 - print(sum_col.dropna()) #NaN 값 자동 삭제 
<col01.add(col02) : add default>
 - add_col  = col01.add(col02)  #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
 - print(add_col.dropna()) #NaN 값 자동 삭제 
<col01.add(col02,fill_value=0) : add, fill_value>
 - add_col  = col01.add(col02,fill_value=0) #부족 값을 0으로 대체하여 0+9 = 9로 반환
<col01.sub(col02,fill_value=0) : sub>
 - sub_col  = col01.sub(col02,fill_value=0) #부족 값을 0으로 대체하여 0-9 = -9로 반환
<col01.mul(col02,fill_value=0) ; multi>
 - mul_col  = col01.mul(col02,fill_value=0) #부족 값을 0으로 대체
<col01.div(col02,fill_value=0) : division>
 - div_col  = col01.div(col02,fill_value=0) #부족 값을 0으로 대체

 

 

#01Series - 시리즈

#한 열을 '시리즈'라고 하며, 시리즈(열)이 모이면 '데이터 프레임'이 된다.

#import pandas as pd
#pandas version check

 -print("pandas version",pd.__version__) 
#시리즈 관련 함수 col = pd.Series([11,22,33,11,22,33,11,22])
 - print(type(col)) #dtype: int64 <class 'pandas.core.series.Series'>
 - print(col.index) #RangeIndex(start=0, stop=3, step=1)
 - print(col.values) #데이터 값 출력
 - print(len(col)) 
 - print(col.size)
#col.value_counts() : 데이터 별 중복 갯수
 - print(col.value_counts())
#col.describe() : 정수 타입 시리즈에 대한 통계
 - print(col.describe()) #갯수, 평균, 표준편차, 중간값, 등..

#col.describe() : 문자 타입 시리즈에 대한 정보
 - print(col.describe()) #정수와는 다른 정보가 나온다.
 - count     8 - 데이터 수
 - unique    3 - 고유 값 수
 - top       a - 비중이 큰 원소 중 선행한 원소
 - freq      3 - top 원소의 중복 수 

#여러 방법으로 시리즈를 생성할 수 있다.
 - col = pd.Series([i for i in range(1,10+1)]) #리스트
 - col = pd.Series(range(1,10+1)) #레인지
 - col = pd.Series(np.arange(1,10+1)) #넘파이레인지
 - col = pd.Series(np.array([i for i in range(1,10+1)])) #넘파이배열
#indexing 값 접근

 - print(col[[3,7]].values) #int32 [4 8]

 - col[1] = col[0] #1번 값을 0번 값으로 변경

 - col[[5,6]] = col[[0,1]] #5,6번 값을 0,1번 값으로 변경
#slicing 값 접근
 - print(col[3:7].values) #int32 [333 444 100 100] >ndarray type
 - print(col[3:7].values[0]) # 333
#비교 연산 가능
 - print((col > 5).values) #조건식에 넣어 각 데이터 별 참/거짓을 반환한다.
 - print(col[col > 5]) #bool indexing 가능 : 조건식이 참인 데이터만 반환한다.
#index를 문자로 변경 가능
 - 인덱스의 형태를 바꿀 수 있다. 
 - col = pd.Series(np.arange(1,10+1),index=[i for i in range(10,10+10)]) #index옵션 추가
 - col = pd.Series(np.arange(1,10+1),index=['A','B','C','D','E','F','G','H','I','J']) #개별 지정 가능
 - col = pd.Series(np.arange(1,10+1),index=[chr(i) for i in range(65,65+10)]) #문자 index가능
 **변경된 index도 인덱싱/슬라이싱 적용이 가능하다.
 - print(col[['A','G']].values) #int32 [4 8]
 - print(col['D':'G'].values) #int32 [4 5 6 7] >ndarray type
#수학 , 통계 함수들 가능
 - print("col.sum():",col.sum()) # 합계
 - print("col.mean():",col.mean()) # 평균
 - print("col.std():",col.std()) # 표준편차
#시리즈 응용
 - print("one_line:\n",pd.Series(x.split('-')[0] for x in phones).value_counts())

#연산함수(add,sub,mul,div)
<col01 + col02>
 - sum_col  = col01 + col02 #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
 - print(sum_col.dropna()) #NaN 값 자동 삭제 
<col01.add(col02) : add default>
 - add_col  = col01.add(col02)  #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
 - print(add_col.dropna()) #NaN 값 자동 삭제 
<col01.add(col02,fill_value=0) : add, fill_value>
 - add_col  = col01.add(col02,fill_value=0) #부족 값을 0으로 대체하여 0+9 = 9로 반환
<col01.sub(col02,fill_value=0) : sub>
 - sub_col  = col01.sub(col02,fill_value=0) #부족 값을 0으로 대체하여 0-9 = -9로 반환
<col01.mul(col02,fill_value=0) ; multi>
 - mul_col  = col01.mul(col02,fill_value=0) #부족 값을 0으로 대체
<col01.div(col02,fill_value=0) : division>
 - div_col  = col01.div(col02,fill_value=0) #부족 값을 0으로 대체

--예문 코드 보기--

더보기
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

print("pandas version",pd.__version__) #pandas version check
print("---------------")
#print(dir(pd))
#한 열을 '시리즈'라고 하며, 시리즈(열)이 모이면 '데이터 프레임'이 된다.

col = pd.Series([11,22,33,11,22,33,11,22])
print(col)
print(type(col)) #dtype: int64 <class 'pandas.core.series.Series'>
print(col.index) #RangeIndex(start=0, stop=3, step=1)
print(col.values) 
print(len(col))
print(col.size)

print("--col.value_counts() : 데이터 별 중복 갯수---")
print(col.value_counts())
print("--col.describe() : 정수 타입 시리즈에 대한 통계---")
print(col.describe()) #갯수, 평균, 표준편차, 중간값, 등..


print("---------------")
col = pd.Series(['a','b','c','a','b','c','a','b'])
print(col)
print(type(col))
print(col.index) 
print(col.values) 
print(len(col))
print(col.size)

print("--col.value_counts() : 데이터 별 중복 갯수---")
print(col.value_counts())
print("--col.describe() : 문자 타입 시리즈에 대한 정보---")
print(col.describe()) #정수와는 다른 정보가 나온다..
#count     8 - 데이터 수
#unique    3 - 고유 값 수
#top       a - 비중이 큰 원소 중 선행한 원소
#freq      3 - top 원소의 중복 수 
print("---------------")
for x in col:
	print(x)
print("---------------")
print("---------------")
col = pd.Series(['a','b','c','a','b','c','a','b'])
print(col+str(20))
print(col+"kim")
print(col+"kim"+"lee")


print("==================")
#여러 방법으로 시리즈를 생성할 수 있다.
col = pd.Series([i for i in range(1,10+1)])
col = pd.Series(range(1,10+1))
col = pd.Series(np.arange(1,10+1))
col = pd.Series(np.array([i for i in range(1,10+1)]))
print(col)
print(col+10)
print(col*10)

print("----indexing  1----")
print(col[0])
col[0] = 100
col[1] = col[0] #1번 값을 0번 값으로 변경
print(col)

print("----indexing  2----")
print(col[[3,7]]) 
print(col[[3,7]].values) #int32 [4 8]
col[[5,6]] = col[[0,1]] #5,6번 값을 0,1번 값으로 변경
col[[3,7]] = [333,777]
col[[4,8]] = np.array([444,888])
print(col)

print("----slicing  1----")
print(col[3:7]) 
print(col[3:7].values) #int32 [333 444 100 100] >ndarray type
print(col[3:7].values[0]) # 333
print(col[3:7].values[1]) # 444

print("--비교 연산 가능------")
col = pd.Series(np.arange(1,10+1))
print(col.values)
print((col > 5).values) #조건식에 넣어 각 데이터 별 참/거짓을 반환한다.

print("--bool indexing 가능------")
print(col[col > 5]) #조건식이 참인 데이터만 반환한다.

print("--index를 문자로 변경 가능------")
col = pd.Series(np.arange(1,10+1)) #옵션 미적용 상태
print(col.index)

#인덱스의 형태를 바꿀 수 있다. 
col = pd.Series(np.arange(1,10+1),index=[i for i in range(10,10+10)]) #index옵션 추가
print(col.index)
col = pd.Series(np.arange(1,10+1),index=['A','B','C','D','E','F','G','H','I','J']) #개별 지정 가능
print(col.index)
col = pd.Series(np.arange(1,10+1),index=[chr(i) for i in range(65,65+10)]) #문자 index가능
print(col.index)

#변경된 index도 인덱싱/슬라이싱 적용이 가능하다.
print("----indexing  3----")
print(col[['A','G']]) 
print(col[['A','G']].values) #int32 [4 8]

print("----slicing  2----")
print(col['D':'G']) #index D~G
print(col['D':'G'].values) #int32 [4 5 6 7] >ndarray type

print("--수학 , 통계 함수들 가능------")
col = pd.Series(np.arange(1,10+1)) 
print(col.values)
print("col.sum():",col.sum()) # 합계
print("col.mean():",col.mean()) # 평균
print("col.std():",col.std()) # 표준편차


print("--시리즈 응용------")
phones = ['010-xxxx-xxxx','02-aaa-aaaa',
				'010-bbbb-bbbb','02-ccc-cccc',
				'010-bbbb-bbbb','032-ccc-cccc',]
				
col = pd.Series(phones)
print(col.values)				
print("value_counts:",col.value_counts())#전체 전화번호 중 가장 큰 중복 데이터 수				
print(col[0])				
print(col[0].split('-'))				
print(col[0].split('-')[0])				
print(col[0].split('-')[1])				
print(col[0].split('-')[2])				
print("----------")	
print(col[1])				
print(col[1].split('-'))				
print(col[1].split('-')[0])				
print(col[1].split('-')[1])				
print(col[1].split('-')[2])				
print("---지역번호별 카운팅(정석)----")
#전체 전화번호에서 지역번호별 카운팅 정석.
lst = []		
for x in col:
	print(x.split('-')[0])
	lst.append(x.split('-')[0])
new_col = pd.Series(lst)
print(new_col)
print(new_col.value_counts())
'''내 풀이
print("----------")				
#지역 번호 별 카운트 확인	
phone_lst = pd.Series(phones)
print(len(phone_lst))

for i in range(len(phone_lst)):
	print(phone_lst[i].split('-')[0])				
	phone_lst[i] = phone_lst[i].split('-')[0]

print(phone_lst.value_counts())
'''
print("---지역번호별 카운팅(시리즈 문법)----")
phones = ['010-xxxx-xxxx','02-aaa-aaaa',
				'010-bbbb-bbbb','02-ccc-cccc',
				'010-bbbb-bbbb','032-ccc-cccc',]

col = pd.Series(phones)
col = pd.Series(x for x in phones) #만들어지는 시리즈는 같지만, 'x'를 활용할 수 있게 된다.
print(col.values)

col = pd.Series(x.split('-')[0] for x in phones) 
print(col.values)
print(col.value_counts())

#한 줄로 사용가능
print("one_line:\n",pd.Series(x.split('-')[0] for x in phones).value_counts())

############################################################
print("---연산함수(add,sub,mul,div)-------")
col01 = pd.Series(range(1,4+1))
print(col01)

col02 = pd.Series(range(5,9+1))
print(col02)

print("---col01 + col02-------")
sum_col  = col01 + col02
print(sum_col) #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
print(sum_col.dropna()) #NaN 값 자동 삭제 

print("---col01.add(col02)-------")
add_col  = col01.add(col02)
print(add_col) #col01이 3번 인덱스까지 밖에 없어, index[4] = NaN 발생
print(add_col.dropna()) #NaN 값 자동 삭제 

print("---col01.add(col02,fill_value=0)-------")
add_col  = col01.add(col02,fill_value=0) #부족 값을 0으로 대체하여 0+9 = 9로 반환
print(add_col)

print("---col01.sub(col02,fill_value=0)-------")
sub_col  = col01.sub(col02,fill_value=0) #부족 값을 0으로 대체환
print(sub_col)

print("---col01.mul(col02,fill_value=0)-------")
mul_col  = col01.mul(col02,fill_value=0) #부족 값을 0으로 대체
print(mul_col)

print("---col01.div(col02,fill_value=0)-------")
div_col  = col01.div(col02,fill_value=0) #부족 값을 0으로 대체
print(div_col)