일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Naive Bayes
- 순회 크롤러
- Machine Learning
- K평균군집화
- 나이브베이즈
- NumPy
- 머신러닝
- control statement
- ML
- python
- 판다스
- Titanic data set
- KMeans Clustering
- 파이썬 객체 지향 프로그래밍
- 타이타닉 데이터
- 넘파이
- Python crawler
- 사이킷런
- sklearn
- 파이썬 크롤러
- 제어문
- scikit-learn
- 배열
- pandas
- Data pre-processing
- dataframe
- 파이썬 크롤링
- 파이썬
- 파이썬 제어문
- python control statement
- Today
- Total
Try to 개발자 EthanJ의 성장 로그
Pandas Series 판다스 시리즈 본문
Pandas Series 판다스 시리즈¶
Pandas¶
데이터 처리 및 분석을 위한 library
대용량 Data를 안정적이면서도 간편하게 처리
서로 다른 data type으로 column 단위들을 구성할 수 있음
c.f.
Numpy
: 전체 배열 원소를 '동일한 타입'으로 제한주요 기능
데이터 입출력:
.csv
,.xlsx
,RDB
,JSON
등 다양한 format의 data 처리 가능데이터 가공: 분리, 결합, 계층, 피봇 등
통계 분석 처리 등
#pandas library, Series, DataFrame namespace 불러오기
import pandas as pd
Series¶
1차원 배열과 유사한 자료형
색인
index
: 행 번호각각의 데이터에 부여하는 속성, default: 0부터 1씩 증가하는 int
index parameter
를 통해 새로운 value로 변경 가능list
,tuple
타입으로 새로운 값을 전달, 다차원 자료형은 사용할 수 없음전달하는 index의 개수와 data의 개수가 일치해야 함
각각의 색인과 data가 mapping되어 있음 >
dict
data type과 유사: dict + index여러 가지 data type을 value로 사용 가능
1. Series 생성¶
pd.Series(data)
- data: single value(
int
,float
,str
) or iterable object(list
,tuple
,numpy
배열)
- data: single value(
1. Series 속성¶
- 속성은 소괄호를 붙이지 않음: 함수 X
index
: Series 객체의 index 배열을 반환values
: Series 객체의 data(value) 배열을 반환name
: Series 객체의 이름을 반환dtype
: Series 객체의 item data type을 반환size
: Series 객체의 data 개수(length)를 반환shape
: Series 객체의 구조(axis=0, axis=1, ..., axis=n-1)를 반환
int
10
을 data로 가지고 있는 Seriesoutput 해석
왼쪽
0
: 자동으로 생성되는 기본 index 번호: 0부터 시작오른쪽
10
: 입력한 data value
sr_1 = pd.Series(10)
sr_1
0 10 dtype: int64
- value(data)를 얻을 때: indexing or slicing
sr_1[0]
10
- Series 객체 내부에 저장된 값 확인
sr_1.values
array([10], dtype=int64)
index 확인
RangeIndex
: 기본적으로 생성되는 index번호를 사용하는 경우 부여됨
sr_1.index
RangeIndex(start=0, stop=1, step=1)
- str 입력
sr_2 = pd.Series('abc')
sr_2
0 abc dtype: object
sr_2.values
array(['abc'], dtype=object)
sr_2.index
RangeIndex(start=0, stop=1, step=1)
list
data type 입력
sr_3 = pd.Series([1, 3, 5])
sr_3
0 1 1 3 2 5 dtype: int64
sr_3.values
array([1, 3, 5], dtype=int64)
sr_3.index
RangeIndex(start=0, stop=3, step=1)
- item data type이 다른
list
입력
sr_4 = pd.Series([10.3, "test", 2000, [1, 2, 3]])
sr_4
0 10.3 1 test 2 2000 3 [1, 2, 3] dtype: object
sr_4.values
array([10.3, 'test', 2000, list([1, 2, 3])], dtype=object)
> data type 특정지을 수 없을때: dtype=object
sr_4.index
RangeIndex(start=0, stop=4, step=1)
dict
입력: 자동label index
부여: 'key' > label index, 'value' > data
sr_5 = pd.Series({'a':10, 'b':20, 'c':30})
sr_5
a 10 b 20 c 30 dtype: int64
sr_5.values
array([10, 20, 30], dtype=int64)
sr_5.index
Index(['a', 'b', 'c'], dtype='object')
dict
로 입력해도RangeIndex
의 int index 사용 가능
sr_5[0]
10
sr_5['a']
10
tuple
입력
sr_6 = pd.Series((1, 2, 3, 4, 5.0))
sr_6
0 1.0 1 2.0 2 3.0 3 4.0 4 5.0 dtype: float64
sr_6.values
array([1., 2., 3., 4., 5.])
인덱스 새로 지정
RangeIndex
범위만큼의 length를 가지는list
ortuple
data로 전달행 개수(data 개수)와 동일한 length를 전달해야 한다.
label index가 없던 경우 > 새롭게 label index 부여
label index가 있던 경우 > 기존에 있던 label index에 덮어씌우기
sr_6.index
RangeIndex(start=0, stop=5, step=1)
sr_6.index = (2018, 2019, 2020, 2021, 2022)
sr_6
2018 1.0 2019 2.0 2020 3.0 2021 4.0 2022 5.0 dtype: float64
Series.index
object에 대해서 item reference는 가능
sr_6.index
Int64Index([2018, 2019, 2020, 2021, 2022], dtype='int64')
sr_6.index[0]
2018
index
instance 내부의 단일 label index item만 수정하는 것은 불가능
sr_6.index[2] = 1998
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_9864\1859156694.py in <module> ----> 1 sr_6.index[2] = 1998 ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value) 5033 @final 5034 def __setitem__(self, key, value): -> 5035 raise TypeError("Index does not support mutable operations") 5036 5037 def __getitem__(self, key): TypeError: Index does not support mutable operations
label index
수정 시 전체 index를 대입해야 한다
sr_6.index = ['q', 'w', 'e', 'r', 't']
sr_6
q 1.0 w 2.0 e 3.0 r 4.0 t 5.0 dtype: float64
dict
data 없이Series
에label index
부여하고 싶은 경우객체 생성 시, index를 optional parameter로 넘겨서 처리 가능
pd.Series(data, index=[...])
sr_7 = pd.Series([10, 20, 30, 40, 50], index=['Mon', 'Tue', 'Wed', 'Thu', 'Fri'])
sr_7
Mon 10 Tue 20 Wed 30 Thu 40 Fri 50 dtype: int64
sr_7.index
Index(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], dtype='object')
sr_7.values
array([10, 20, 30, 40, 50], dtype=int64)
sr_7[2]
30
sr_7['Wed']
30
3. dict
와 Series
의 유사성¶
dict
자료형으로Series
object 생성
my_dict = {'서울':100, '경기':200, '강원':300, '부산':400}
my_sample = pd.Series(my_dict)
print(my_dict)
print(my_sample)
{'서울': 100, '경기': 200, '강원': 300, '부산': 400} 서울 100 경기 200 강원 300 부산 400 dtype: int64
Series
객체와in
연산자in
연산자를 사용해 내부 요소 검사:dict
의in
연산자 사용법과 동일key
value에 해당하는label index
를 이용해 item의 존재 여부를bool
type return
print('서울' in my_dict)
print('강원' in my_sample)
True True
for loop
에서in
연산자로 접근: iterable objectdict
의 key,Series
의 value reference
for item in my_dict:
print(item)
print('=' * 10)
for value in my_sample.values:
print(value)
서울 경기 강원 부산 ========== 100 200 300 400
label index
변경:pd.Series(data, index=label_index)
지정한
label_index
기준으로Series
생성지정한
label_index
에 매칭되지 않는 data는NaN
값으로 저장됨NaN
: Not a Number:numpy
에서 해당 위치가 비었음을 의미하는 data(null)c.f.
None
: Python primitive null data type
new_index = ['서울', '강원', '경기', '제주']
new_sample = pd.Series(my_dict, index=new_index)
new_sample
서울 100.0 강원 300.0 경기 200.0 제주 NaN dtype: float64
my_dict
{'서울': 100, '경기': 200, '강원': 300, '부산': 400}
4. 인덱싱(indexing)¶
특정 값(single value)을 reference
referenced index: RangeIndex
int index
,label index
새로운
label index
를 지정해도, RangeIndexint index
사용 가능
my_data = {'a':10, 'b':20, 'c':30}
sr_6 = pd.Series(my_data)
sr_6
a 10 b 20 c 30 dtype: int64
Indexing
Index indexing:
_Series object_.index[RangeIndex int index]
value(item) indexing:
_Series object_[RangeIndex int index or label index]
print(sr_6.index[0])
print(sr_6[0])
a 10
sr_6['a']
10
- '요일'-int data
sr_7
Mon 10 Tue 20 Wed 30 Thu 40 Fri 50 dtype: int64
label index
에 해당하는 data value 변경_Series_.index[label_index]
: Error_Series_.index[RangeIndex]
: data value 아닌label index
추출, 변경 불가능_Series_[label_index or RangeIndex]
: 변경 가능
sr_7.index['Mon']
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_9864\963837586.py in <module> ----> 1 sr_7.index['Mon'] ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in __getitem__(self, key) 5067 key = np.asarray(key, dtype=bool) 5068 -> 5069 result = getitem(key) 5070 # Because we ruled out integer above, we always get an arraylike here 5071 if result.ndim > 1: IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
print(sr_7['Tue'])
sr_7['Tue'] = 200
sr_7
20
Mon 10 Tue 200 Wed 30 Thu 40 Fri 50 dtype: int64
print(sr_7[0])
sr_7[0] = 100
sr_7
10
Mon 100 Tue 200 Wed 30 Thu 40 Fri 50 dtype: int64
Series
에서 두 개 이상의 원하는 행(row)만 추출하기:행(row) == label index
- 추출 할 row들을 이중 list로 indexing:
_Series_[[row1, row2, ..., rowN]]
- 추출 할 row들을 이중 list로 indexing:
sr_7[['Mon', 'Thu']]
Mon 100 Thu 40 dtype: int64
list
안의tuple
로 추출 불가능
sr_7[('Mon', 'Thu')]
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_9864\3856407577.py in <module> ----> 1 sr_7[('Mon', 'Thu')] ~\anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key) 982 return self._get_values(key) 983 --> 984 return self._get_with(key) 985 986 def _get_with(self, key): ~\anaconda3\lib\site-packages\pandas\core\series.py in _get_with(self, key) 997 ) 998 elif isinstance(key, tuple): --> 999 return self._get_values_tuple(key) 1000 1001 elif not is_list_like(key): ~\anaconda3\lib\site-packages\pandas\core\series.py in _get_values_tuple(self, key) 1032 1033 if not isinstance(self.index, MultiIndex): -> 1034 raise KeyError("key of type tuple not found and not a MultiIndex") 1035 1036 # If key is contained, would have returned by now KeyError: 'key of type tuple not found and not a MultiIndex'
5. 슬라이싱 (Slicing)¶
_Series_[start index: stop index: step]
특정 범위의 값을 선택하거나 변경:
RangeIndex int index
,label index
둘 다 사용 가능RangeIndex int index
slicing: not includingstop index
label index
slicing: includingstop index
sr_en = pd.Series([10, 20, 30, 40, 50], index=list('abcde'))
sr_en
a 10 b 20 c 30 d 40 e 50 dtype: int64
# RangeIndex: 0 ~ 1
sr_en[0:2]
a 10 b 20 dtype: int64
# label index: 'a' ~ 'c'
sr_en['a':'c']
a 10 b 20 c 30 dtype: int64
# RangeIndex int index + step
sr_en[0:5:2]
a 10 c 30 e 50 dtype: int64
# label index + step
sr_en['b':'d':2]
b 20 d 40 dtype: int64
6. 조건 색인(Boolean Indexing)¶
Series[dtype=bool Series]
원본 객체와 같은
shape
과index
,dtype=bool
인Series
객체로 indexingSeries object
에 vector, scalar opration을 적용 >dtype=bool
인 object return
sr_int = pd.Series([10, -3, -31, 34, -35, 14, -61, 12, 0])
sr_int
0 10 1 -3 2 -31 3 34 4 -35 5 14 6 -61 7 12 8 0 dtype: int64
비교연산자
<
+ scalar value0
- 조건 만족 여부 bool type(
True
orFalse
)을 item으로 갖는Series
obj return
- 조건 만족 여부 bool type(
sr_int < 0
0 False 1 True 2 True 3 False 4 True 5 False 6 True 7 False 8 False dtype: bool
- Boolean Indexing:
Series[dtype=bool Series]
sr_int[sr_int < 0]
1 -3 2 -31 4 -35 6 -61 dtype: int64
- 두 개 이상의 조건 처리:
and
$\rightarrow$&
,or
$\rightarrow$|
sr_int[(sr_int > 10) & (sr_int < 40)]
3 34 5 14 7 12 dtype: int64
7. Operation with scalar value, Series object¶
Operation between
Series object
andscalar value
- BroadCasting 발생
Operation between
Series object
andSeries object
일치하는
label index
간 연산 수행, 공동으로 존재하지 않는 경우NaN
returnlabel index
가 없는 경우 RangeIndexint index
차례대로 연산 수행
> item 개수 다르면NaN
returnoptional parameter
fill_value=value
:NaN
대체 가능
연산의 종류
add:
+
,sr.add(sr)
subtract:
-
,sr.sub(sr)
multiply:
*
,sr.mul(sr)
divide:
/
,sr.div(sr)
modulo:
%
,sr.mod(sr)
int divide:
//
,sr.floordiv(sr)
sr_1 = pd.Series([1, 2, 3, 4], index=list('abcd'))
sr_2 = pd.Series([10, 20, 30, 40, 50, 60], index=list('acdefg'))
sr_1
a 1 b 2 c 3 d 4 dtype: int64
sr_2
a 10 c 20 d 30 e 40 f 50 g 60 dtype: int64
- Operation between
Series object
andscalar value
> BroadCasting
sr_2 * 3
a 30 c 60 d 90 e 120 f 150 g 180 dtype: int64
Operation between
Series object
andSeries object
- 공통
label index
or RangeIndexint index
끼리 연산
> 한 객체에만 존재하는 index:NaN
value로 채워짐
- 공통
sr_1 + sr_2
a 11.0 b NaN c 23.0 d 34.0 e NaN f NaN g NaN dtype: float64
optional parameter
fill_value=value
- 공통으로 존재하지 않는 index의 value에 대해
NaN
대신value
로 연산 적용
- 공통으로 존재하지 않는 index의 value에 대해
sr_1.add(sr_2, fill_value=0)
a 11.0 b 2.0 c 23.0 d 34.0 e 40.0 f 50.0 g 60.0 dtype: float64
sr_1.add(sr_2, fill_value=100)
a 11.0 b 102.0 c 23.0 d 34.0 e 140.0 f 150.0 g 160.0 dtype: float64
- subtract operation between
Series object
sr_1.sub(sr_2)
a -9.0 b NaN c -17.0 d -26.0 e NaN f NaN g NaN dtype: float64
sr_1.sub(sr_2, fill_value=0)
a -9.0 b 2.0 c -17.0 d -26.0 e -40.0 f -50.0 g -60.0 dtype: float64
- multiply operation between
Series object
sr_1.mul(sr_2)
a 10.0 b NaN c 60.0 d 120.0 e NaN f NaN g NaN dtype: float64
sr_1 * sr_2
a 10.0 b NaN c 60.0 d 120.0 e NaN f NaN g NaN dtype: float64
sr_1.mul(sr_2, fill_value=1)
a 10.0 b 2.0 c 60.0 d 120.0 e 40.0 f 50.0 g 60.0 dtype: float64
- divide operation
sr_1 / sr_2
a 0.100000 b NaN c 0.150000 d 0.133333 e NaN f NaN g NaN dtype: float64
sr_1.div(sr_2)
a 0.100000 b NaN c 0.150000 d 0.133333 e NaN f NaN g NaN dtype: float64
sr_1.div(sr_2, fill_value=1)
a 0.100000 b 2.000000 c 0.150000 d 0.133333 e 0.025000 f 0.020000 g 0.016667 dtype: float64
import numpy as np
arr_data = np.random.randint(1, 100, size=26)
sr_data = pd.Series(arr_data, index=list('abcdefghijklmnopqrstuvwxyz'))
sr_data
a 78 b 75 c 46 d 43 e 53 f 73 g 23 h 84 i 48 j 79 k 5 l 71 m 27 n 38 o 24 p 50 q 99 r 39 s 22 t 13 u 61 v 84 w 45 x 57 y 66 z 14 dtype: int32
label index='k'
item value print
sr_data['k']
5
label index='a', 'f', 'c'
item value print
sr_data[['a', 'f', 'c']]
a 78 f 73 c 46 dtype: int32
- RangeIndex
int index 5 ~ 15
item value print
sr_data[5:16]
f 73 g 23 h 84 i 48 j 79 k 5 l 71 m 27 n 38 o 24 p 50 dtype: int32
- 뒤부터 5개 row 출력
sr_data[-5:]
v 84 w 45 x 57 y 66 z 14 dtype: int32
Series object
의 item 개수 출력
sr_data.size
26
len(sr_data)
26
- item value들의 평균보다 큰 item만 출력
sr_data[sr_data > sr_data.values.mean()]
a 78 b 75 e 53 f 73 h 84 j 79 l 71 q 99 u 61 v 84 x 57 y 66 dtype: int32
sr_data[sr_data > sr_data.mean()]
a 78 b 75 e 53 f 73 h 84 j 79 l 71 q 99 u 61 v 84 x 57 y 66 dtype: int32
- data item value 중에
50
이 있는지 확인하여 bool type print
50 in sr_data.values
True
'CS & DS > Numpy & Pandas' 카테고리의 다른 글
Pandas Data Loading 판다스 데이터 적재 (0) | 2022.11.05 |
---|---|
Pandas DataFrame 판다스 데이터프레임 (0) | 2022.11.05 |
Numpy array Manipulation 넘파이 배열 변형 (0) | 2022.11.02 |
Numpy Operation 넘파이 연산 (0) | 2022.10.30 |
Basic Numpy 넘파이 기초 (0) | 2022.10.24 |