***<Series 요소 접근>***
◆ Pandas의 Series에서 개별 요소에 접근하는 방법은 여러 가지가 있다.
◆ 각 방법은 상황에 따라 유용하게 사용할 수 있으며, 인덱스나 레이블을 사용해 접근할 수 있다.
[ 1 ] 인덱스로 접근하기
Python 리스트처럼 Series의 각 요소에 인덱스를 사용해 접근할 수 있다.
- 인덱스는 0부터 시작한다.
_____________________________________________________
import pandas as pd
s = pd.Series([10, 20, 30, 40])
# 첫 번째 요소 접근
print(s[0])
-----------------------------------------------------
결과:
10
[ 2 ] 레이블(인덱스 이름)로 접근하기
Series에서 인덱스에 레이블(이름)을 지정할 수 있으며, 이를 통해 값을 접근할 수 있다.
_______________________________________________________________
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
# 인덱스 레이블 'a'에 해당하는 값에 접근
print(s['a'])
---------------------------------------------------------------
결과:
10
[ 3 ] iloc을 사용해 정수 위치로 접근하기
- iloc는 인덱스의 정수 위치를 기반으로 요소에 접근한다.
- iloc은 인덱스가 숫자가 아니더라도 위치에 따라 접근할 수 있다.
_______________________________________________________________
# 두 번째 요소 접근 (0부터 시작)
print(s.iloc[1])
---------------------------------------------------------------
결과:
20
[ 4 ] loc을 사용해 레이블로 접근하기
- loc는 인덱스 레이블을 사용해 요소에 접근할 수 있다.
- 숫자형 인덱스가 아닌 경우에도 유용하다.
_______________________________________________________________
# 인덱스 레이블 'c'에 해당하는 값에 접근
print(s.loc['c'])
---------------------------------------------------------------
결과:
30
[ 5 ] 슬라이싱(Slicing)으로 여러 요소 접근하기
- 리스트와 마찬가지로 Series에서도 슬라이싱을 사용할 수 있다.
- 슬라이싱을 통해 여러 값을 가져올 수 있으며, 범위를 지정한다.
_______________인덱스를 사용한 슬라이싱:_________________
# 첫 번째에서 세 번째 요소까지 접근 (0, 1, 2)
print(s[0:3])
--------------------------------------------------------------
결과:
a 10
b 20
c 30
dtype: int64
_______________레이블을 사용한 슬라이싱:_________________
# 'a'부터 'c'까지 슬라이싱
print(s['a':'c'])
--------------------------------------------------------------
결과:
a 10
b 20
c 30
dtype: int64
[ 6 ] 조건을 사용한 필터링
Series에서 조건을 사용해 특정 조건을 만족하는 요소들에 접근할 수 있다.
______________________________________________
# 20보다 큰 요소만 접근
print(s[s > 20])
----------------------------------------------
결과:
c 30
d 40
dtype: int64
[ 7 ] 여러 인덱스를 사용해 접근하기
-리스트나 배열처럼 여러 인덱스나 레이블을 리스트로 전달하여 여러 요소에 동시에 접근할 수 있다.
______________________________________________
# 'a'와 'c'에 해당하는 요소만 접근
print(s[['a', 'c']])
----------------------------------------------
결과:
a 10
c 30
dtype: int64
***< Series 연산 >********************************************
◆ 판다스의 시리즈(Series)는 인덱스(Index)를 기반으로 동작하기 때문에 일반적인 리스트 연산보다 훨씬 강력하다.
◆ 시리즈 연산의 핵심은 '인덱스 정렬(Index Alignment)'에 있다.
[ 1 ] 산술 연산 (Arithmetic Operations)
- 시리즈에 숫자를 더하거나 곱하면 모든 요소에 동일한 연산이 적용되는 브로드캐스팅(Broadcasting)이 일어난다.
_____________________________________________________________________________________
import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
# 1. 시리즈와 숫자 연산
print(s + 5) # 모든 요소에 5를 더함
# 2. 시리즈와 시리즈 연산
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s1 + s2) # 같은 인덱스끼리 더함
--------------------------------------------------------------------------------------
[ 2 ] 인덱스 정렬 (Index Alignment)
- 판다스 연산의 가장 큰 특징은 인덱스가 서로 달라도 알아서 짝을 맞춰 연산한다.
- 만약 한쪽에만 인덱스가 존재한다면 결과는 NaN(Not a Number, 결측치)으로 처리된다.
_____________________________________________________________________________________
s1 = pd.Series([1, 2], index=['a', 'b'])
s2 = pd.Series([10, 20], index=['b', 'c'])
print(s1 + s2)
# 결과:
# a NaN (s2에 a가 없음)
# b 22.0 (2 + 20)
# c NaN (s1에 c가 없음)
--------------------------------------------------------------------------------------
[ 3 ] 연산 메서드와 fill_value
NaN이 발생하는 것을 방지하고 싶다면, 연산 기호(+, -) 대신 연산 메서드를 사용하고 기본값을 지정할 수 있다.
연산기능 메서드
---------------------------------------------------
덧셈 s1.add(s2, fill_value=0)
뺄셈 s1.sub(s2, fill_value=0)
곱셈 s1.mul(s2, fill_value=1)
나눗셈 s1.div(s2, fill_value=1)
----------------------------------------------------
[ 4 ] 비교 및 논리 연산
시리즈 내의 데이터가 특정 조건에 맞는지 확인하여 True/False 형태의 불리언(Boolean) 시리즈를 반환한다.
- 이 결과는 데이터를 필터링할 때 매우 유용하다.
_____________________________________________________
s = pd.Series([10, 20, 30, 40])
# 25보다 큰 요소 찾기
mask = s > 25
print(mask)
# 0 False
# 1 False
# 2 True
# 3 True
# 조건에 맞는 데이터만 추출
print(s[mask])
-------------------------------------------------------