Adventure Time - Finn 3
본문 바로가기
AI/파이썬

pandas - Series

by hyun9_9 2026. 4. 9.

pandas : 데이터 분석 라이브러리

행, 열 형태의 정형 데이터 객체를 다룸

2차원 데이터

엑셀 시트, RDB 의 테이블과 같은 형태

 

Series

pandas의 기본 객체중 하나

numpy의 ndarray를  기반으로 인덱싱 기능이 추가된 1차원 배열을 나타냄(index * value의 형태)

index를 지정하지 않을 시 기본적으로 ndarray와 같이 0-based인덱스 생성, 지정할 경우 명시적으로 지정된 index 사용

 

import pandas as pd

 

Series 생성

s1 =pd.Series([10,20,30])


	0
0	10
1	20
2	30

# 왼쪽이 index, 오른쪽이 value(값), dtype : 데이터 타입
# 데이터로만 생성하게 되면, index는 0-base 인덱스로 생성됨

 

.values / .index / .dtype

s1.values
# array([10, 20, 30])

s1.index
# RangeIndex(start=0, stop=3, step=1)

s1.dtype
# dtype('int64')

# indexing
s1[0]
# np.int64(10)

 

data = , index= 명시하여 Series 생성

pd.Series(data=[1,2,3],index=[100,200,300])
"""
	0
100	1
200	2
300	3
"""

# index 는 굳이 정수일 필요 없다!
s5 = pd.Series(data=[1, 2, 3], index=['john', 'mark', 'charlie'])

"""
	0
john	1
mark	2
charlie	3
"""

 

# index 중복 허용된다!!  (array 와는 다르다!)
s6 = pd.Series([1, 2, 3], ['john', 'john', 'charlie'])

"""
	0
john	1
john	2
charlie	3
"""

# 중복 indexing 결과 Series!!
s6['john']
"""

	0
john	1
john	2
"""

 

dict 로 생성

# dict 로 Series 생성
sdata = {'김철수': 35000, '이상현': 67000, '최종수': 12000, '박진관': 4000}
pd.Series(sdata)

# dict 의
#   key -> index,
#   value -> value,

"""
	0
김철수	35000
이상현	67000
최종수	12000
박진관	4000
"""

 

Series ndim, shape, size, len, unique, count, value_counts 함수

size :  개수 반환

shape : 튜플형태로 shape 반환

unique :  유일한 값만 ndarray로 반환

count : NaN을 제외한 개수를 반환

mean : NaN을 제외한 평균

value_counts : NaN을 제외하고 각 값들의 빈도를 반환

 

nan 값의 연산 

- 집계 연산의 경우 nan 값은 제외되어 연산된다 (numpy와 다른점)

- count, mean, max, min, ...

 

s1 = pd.Series([1, 1, 2, 1, 2, 2, 2, 1, 1, 3, 3, 4, 5, 5, 7, np.nan])
# value_counts()  고유한 값들의 개수
s1.value_counts()


	count
1.0	5
2.0	4
3.0	2
5.0	2
4.0	1
7.0	1

 

Series 연산

index 기준으로 연산

 

numpy와 마찬가지로 Series 끼리 연산 가능

포인트 : 같은 인덱스 기준으로 연산한다

 

s1 = pd.Series([1, 2, 3, 4], ['a', 'b', 'c', 'd'])
s2 = pd.Series([6, 3, 2, 1], ['d', 'c', 'b', 'a'])  # 인덱스 순서 다르다

s1 + s2

"""
	0
a	2
b	4
c	6
d	10
"""

 

산술연산

Series의 경우헤도 스칼라와의 연산 각 원소별로 스칼라와의 연산이 적용

Series와의 연산은 각 인덱스에 맞는 값끼리 연산이 적용

이때 인덱스의 pair 가 맞지 않으면 결과는  NaN

s1 ** 2
"""
	0
a	1
b	4
c	9
d	16

"""


s1 ** s2  # Series 는 동일 인덱스끼리 연산
"""

	0
a	1
b	4
c	27
d	4096
"""

 

 

Boolean selection

boolean Series가 []와 함꼐 사용되면 True 값에 해당하는 값만 새로 반환되는 Series 객체에 포함됨

다중조건의 경우,&(and) ,|(or)를 사용하여 연결 가능

s = pd.Series(np.arange(10), np.arange(10) + 1)


s > 5  # 결과는 boolean Series
"""

	0
1	False
2	False
3	False
4	False
5	False
6	False
7	True
8	True
9	True
10	True
"""

# 5보다 큰 value 들만 골라낸 Series
s[s > 5]
"""
	0
7	6
8	7
9	8
10	9
"""

 

 

Series 값 삭제 : drop()

s = pd.Series(np.arange(100, 105), ['a', 'b', 'c', 'd', 'e'])

# 특정 index 삭제. 원본 변화 없다!
s.drop('e')

"""
	0
a	200
b	101
c	102
d	103
"""

 

inplace = 원본변경

★중요★

drop() 함수는 drop 한 결과를 새로 만들어서 리턴 한거고

원본 데이터 s 는 변경하지 않는다

 

numpy, pandas 그 밖의 수많은 데이터 관련 모듈들에서의 대부분의 객체 함수들은 호출한 원본 객체를 변경하진 않고 원본의 사본을 만든뒤 사본에 연산 수행하여 그 사본을 리턴하도록 동작한다

 

하지만 inplace =True 파라미터를 주면 사본을 만들지 않고 원본을 변화시키도록 동작한다

 

s.drop('e', inplace=True)  # 이 경우 리턴값 없다! None (원본 변화 발생!)

 

 

Multi lenel index

# multi-level index 를 가진 Series

s4 = pd.Series(
    np.arange(100, 106),

    index = [
        ['a', 'a', 'b', 'b', 'c', 'c'], # <- level 0 index
        [ 1 ,  2 ,  1,   2 ,  1,   2 ], # <- level 1 index
    ],

)

"""

		0
a	1	100
2		101
b	1	102
2		103
c	1	104
2		105
"""

s4.index
"""
MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2),
            ('c', 1),
            ('c', 2)],
           )
"""

 

# tuple 인덱싱으로 value 접근

s4['a',1]
# np.int64(100)

s4['a']
"""
	0
1	100
2	101
"""

# ↑
# s4: 2-level index
# s4['a'] : 1-level index

 

xs()를 사용한 인덱스

cross-section

s4.xs('a')   # level 0 인덱싱  <= s4['a'] 와 결과 동일

s4.xs(('a', 1))  # () 괄호 꼭 필요!   # s4['a', 1] 과 동일

# s4.xs(2)  # 에러, level 0 에서 2 라는 index? 없다!
s4.xs(2, level=1)

s4.xs(2, level=-1) # 마지막 레벨의 index에서 찾음


s4.xs((2, 'b'), level=(1, 0)) # 각각 지정

 

 

apply() 함수

Series 각 value 원소에 함수를 적용(apply) 할때 사용.

일종의 원소별(element-wise) 변환 역할

 

Series.apply(func, convert_dtype=True, args=(), **kwargs)
s = pd.Series([1, 2, 3, 4, 5])

# 각 원소에 제곱 적용
result = s.apply(lambda x: x ** 2)
print(result)

 

# 사용자 정의함수 적용
def custom_func(x):
    return f"Value: {x}"

result = s.apply(custom_func)
print(result)

 

# 추가인자 전달
def multiply(x, factor):
    return x * factor
# args의 10 값은 factor로 들어감
result = s.apply(multiply, args=(10,))
print(result)

 

# 문자열 처리
s2 = pd.Series(["  apple ", "banana", " Cherry "])

# strip + 소문자 변환
result = s2.apply(lambda x: x.strip().lower())
print(result)

'AI > 파이썬' 카테고리의 다른 글

pandas - DataFrame column 선택하기  (0) 2026.04.11
pandas - DataFrame  (0) 2026.04.10
numpy - Boolean Indexing  (0) 2026.04.08
numpy - axis (차원축)  (0) 2026.04.07
numpy - shape (차원) 변경하기  (0) 2026.04.06