6.2.1 Series 생성과 활용

① Series 생성

다음의 다양한 종류의 입력으로 생성할 수 있다.

  • 1차원 ndarray, 목록, 딕셔너리 또는 Series
  • 2차원 numpy.ndarray
  • 하나의 Series
  • 다른 하나의 DataFrame

키워드 인자 name='first'로 속성 name 지정이 가능하다.

import numpy as np
import pandas as pd

s = pd.Series([1, 3, 5, np.nan, 6, 8], name='first')
print(s)

출력:

0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
Name: first, dtype: float64

② Series 주요 속성

생성한 시리즈 sname은 다음 속성으로 알아볼 수 있다.

s.name
# 6.2.1 'first'

생성한 시리즈 s의 기본 index는 RangeIndex(start=0, stop=6, step=1)이다.

s.index
# 6.2.1 RangeIndex(start=0, stop=6, step=1)

생성한 시리즈 s의 속성 values는 시리즈의 값으로 ndarray 자료형이다.

s.values
# 6.2.1 array([ 1.,  3.,  5., nan,  6.,  8.])

속성 shape로 시리즈의 차수와 모양을 알 수 있다.

s.shape
# 6.2.1 (6,)

속성 size로 시리즈의 원소 수를 알 수 있다.

s.size
# 6.2.1 ```

#### ③ 시리즈 인덱싱과 index, 슬라이싱

시리즈는 첨자로 원소값을 반환받을  있다.

```python
s[1]
# 6.2.1 ```

시리즈는 인덱싱 `1:5` 1에서 4까지의 원소의 부분 시리즈를 반환받을  있다. , 반환값도 시리즈이다.

```python
s[1:5]

출력:

1    3.0
2    5.0
3    NaN
4    6.0
Name: first, dtype: float64

다음 코드로 이미 생성된 시리즈에 다시 문자열의 index를 지정할 수 있다.

s.index = list('abcdef')
print(s)

출력:

a    1.0
b    3.0
c    5.0
d    NaN
e    6.0
f    8.0
Name: first, dtype: float64

새로 지정한 색인으로도 참조 가능하다.

print(s['b'], s['e'])
# 6.2.1 6.0

물론, 새로 지정한 인덱싱으로 부분 시리즈를 반환받을 수 있다. 레이블 인덱싱이 정수 인덱싱과 다른 것은 마지막인 ‘e’를 포함한다는 것이다.

s['c':'e']

출력:

c    5.0
d    NaN
e    6.0
Name: first, dtype: float64

다음 인덱싱으로도 첨자 ‘b’에서 ‘f’까지의 원소로 구성된 시리즈를 반환한다.

s['b':'f']

출력:

b    3.0
c    5.0
d    NaN
e    6.0
f    8.0
Name: first, dtype: float64

레이블인 문자열 index를 지정해도 기본 정수 index는 사용할 수 있다. 다음 인덱싱으로도 첨자 0에서 2까지의 원소로 구성된 시리즈를 반환한다.

s[0:3]

출력:

a    1.0
b    3.0
c    5.0
Name: first, dtype: float64

다음으로 첨자 1에서 3까지의 원소로 구성된 시리즈를 뷰로 반환한다.

s1 = s[1:4]
print(s1)

출력:

b    3.0
c    5.0
d    NaN
Name: first, dtype: float64

s1[0]으로는 3이 참조된다.

s1[0]
# 6.2.1 ```

다음 코드로 `s1`  원소를 10으로 수정할  있다.

```python
s1[0] = 10
print(s1)

출력:

b    10.0
c     5.0
d     NaN
Name: first, dtype: float64

위에서 수정된 값은 원본 s에도 반영이 된 것을 확인할 수 있다.

print(s)

출력:

a     1.0
b    10.0
c     5.0
d     NaN
e     6.0
f     8.0
Name: first, dtype: float64

다음으로 시리즈 index를 달리 지정할 수 있다.

s.index = np.arange(1, 7)
print(s)

출력:

1     1.0
2    10.0
3     5.0
4     NaN
5     6.0
6     8.0
Name: first, dtype: float64

새로운 정수 첨자로 하나의 원소를 참조할 수 있다.

s[1]
# 6.2.1 ```

그러나 새로운 정수 첨자에는 0 없으므로 다음 `s[0]`으로는 오류가 발생한다.

```python
# 6.2.1 s[0]
# 6.2.1 KeyError: 0

0에서부터 시작되는 기본 정수 첨자 대신에 다른 정수 첨자를 지정하는 것은 권장하지 않는다.

다음처럼 정수 슬라이싱은 기본 정수 첨자로 간주해 부분 시리즈를 반환한다.

s[1:3]

출력:

2    10.0
3     5.0
Name: first, dtype: float64

④ 시리즈 고급 인덱싱

다음 이름이 age인 시리즈를 생성해 변수 age에 저장한다.

import pandas as pd

age = pd.Series([9, 17, 32, 45, 65, 98], index=list('abcdef'), name='age')
print(age)

출력:

a     9
b    17
c    32
d    45
e    65
f    98
Name: age, dtype: int64

다음이 고급 인덱싱으로 numpy 배열과 같이 [첨자 목록]으로 각 원소로 구성된 시리즈를 반환한다. 위 결과는 스칼라 값이나 다음 결과는 시리즈이다.

age[[1, 3, 5]]

출력:

b    17
d    45
f    98
Name: age, dtype: int64

우리가 지정한 문자열 첨자로도 고급 첨자는 가능하다.

age[['a', 'f', 'd']]

출력:

a     9
f    98
d    45
Name: age, dtype: int64

다음 코드 age[['c']]처럼 하나의 레이블 인덱스도 리스트로 지정하면 결과는 시리즈이다.

age[['c']]

출력:

c    32
Name: age, dtype: int64

⑤ 시리즈 논리 참조(블리안 인덱싱)

다음 시리즈 s가 있다.

import pandas as pd

s = pd.Series([3, 6, -3, 0, -4, 8, -7])
print(s)

s > 0인 논리(condition) 결과의 시리즈를 반환한다.

s > 0

출력:

0     True
1     True
2    False
3    False
4    False
5     True
6    False
dtype: bool

다음 코드는 조건 s%2 == 0의 논리 결과의 시리즈를 반환한다.

s % 2 == 0

s[s > 0]을 수행하면 값이 True인 원소만으로 구성된 시리즈가 반환된다.

s[s > 0]

출력:

0    3
1    6
5    8
dtype: int64

다음 조건 연산의 논리 인덱싱으로 양수이고 2로 나누어 떨어지는 값만으로 구성된 시리즈를 반환한다.

s[(s > 0) & (s % 2 == 0)]

출력:

1    6
5    8
dtype: int64
서브목차