09. 시리즈의 속성·메서드와 다루기

🎯 이 장의 목표
  • 시리즈를 값·인덱스 기준으로 정렬한다
  • 시리즈에 수학 연산을 적용한다(벡터화)
  • 특정 요소가 있는지 확인한다
  • 인덱싱·슬라이싱으로 원하는 부분을 꺼낸다
💡 팁
맨 위 셀에서 import pandas as pd를 먼저 실행하세요.

정렬하기: 값 기준, 인덱스 기준

시리즈를 크기순으로 줄 세울 수 있습니다.

PYTHON
import pandas as pd

scores = pd.Series([85, 92, 78, 90],
                   index=["철수", "영희", "민수", "지수"])

print(scores.sort_values())               # 값 기준 오름차순
print(scores.sort_values(ascending=False))# 값 기준 내림차순

실행 결과:

CODE
민수    78
철수    85
지수    90
영희    92
dtype: int64
영희    92
지수    90
철수    85
민수    78
dtype: int64
🔑 새 용어 — ascending
"오름차순"이라는 뜻입니다. ascending=True(기본값)면 작은 것부터, ascending=False면 큰 것부터 정렬합니다.

인덱스(이름표) 기준으로도 정렬할 수 있습니다.

PYTHON
print(scores.sort_index())   # 인덱스(이름) 가나다순

실행 결과:

CODE
민수    78
영희    92
지수    90
철수    85
dtype: int64
⚠️ 흔한 실수
흔한 실수 — 원본은 그대로다
sort_values()정렬된 새 시리즈를 돌려줄 뿐, 원본 scores는 바뀌지 않습니다. 정렬 결과를 계속 쓰려면 scores = scores.sort_values()처럼 다시 담아야 합니다. (대부분의 Pandas 메서드가 이렇게 동작합니다.)

수학 연산 (벡터화)

NumPy에서 본 벡터화가 시리즈에도 그대로 적용됩니다. 반복문 없이 전체에 한 번에 연산합니다.

PYTHON
import pandas as pd

prices = pd.Series([1000, 2000, 3000],
                   index=["커피", "케이크", "샌드위치"])

print(prices * 1.1)        # 모든 가격에 10% 인상
print(prices - 500)        # 모두 500원 할인

실행 결과:

CODE
커피      1100.0
케이크     2200.0
샌드위치    3300.0
dtype: float64
커피       500
케이크     1500
샌드위치    2500
dtype: int64

시리즈끼리도 연산됩니다. 같은 인덱스끼리 자동으로 짝지어 계산하는 점이 강력합니다.

PYTHON
jan = pd.Series({"커피": 100, "케이크": 50})
feb = pd.Series({"커피": 120, "케이크": 60})

print(jan + feb)   # 같은 메뉴끼리 합산

실행 결과:

CODE
커피     220
케이크    110
dtype: int64
💡 팁
인덱스 정렬(alignment): Pandas는 인덱스를 보고 알아서 같은 항목끼리 계산합니다. 순서가 달라도 이름표만 맞으면 올바르게 짝지어집니다. 엑셀에서 줄을 일일이 맞추는 수고가 사라집니다.

조건으로 골라내기 (불리언 인덱싱)

NumPy의 조건 선택과 똑같이, 조건에 맞는 값만 골라냅니다. 데이터 분석에서 가장 자주 쓰는 기술 중 하나입니다.

PYTHON
import pandas as pd

scores = pd.Series([85, 92, 78, 90, 65],
                   index=["철수", "영희", "민수", "지수", "현우"])

print(scores > 80)          # 각자 80 초과인지 (참/거짓)
print(scores[scores > 80])  # 80 초과인 사람만

실행 결과:

CODE
철수     True
영희     True
민수    False
지수     True
현우    False
dtype: bool
철수    85
영희    92
지수    90
dtype: int64

읽는 법: scores[scores > 80]는 "scores에서 (80 초과) 조건이 참인 값만 꺼내라."

특정 요소가 있는지 확인하기

in 키워드는 인덱스에 해당 라벨이 있는지 확인합니다.

PYTHON
import pandas as pd

stock = pd.Series({"사과": 10, "바나나": 0, "포도": 5})

print("사과" in stock)      # 인덱스에 '사과'가 있나?
print("딸기" in stock)      # 인덱스에 '딸기'가 있나?

실행 결과:

CODE
True
False
⚠️ 흔한 실수
흔한 함정 — in은 값이 아니라 인덱스를 본다
10 in stockFalse입니다. in값(10)이 아니라 인덱스(사과·바나나·포도)에서 찾기 때문입니다. 값에서 찾으려면 10 in stock.values라고 해야 합니다.

인덱싱: 한 개 값 꺼내기

인덱스(라벨)나 위치 번호로 값 하나를 꺼냅니다.

PYTHON
import pandas as pd

s = pd.Series([10, 20, 30, 40],
              index=["a", "b", "c", "d"])

print(s["b"])       # 라벨로
print(s.iloc[1])    # 위치 번호로 (0부터)

실행 결과:

CODE
20
20
🔑 새 용어 — iloc
iloc는 "integer location"의 줄임으로, 위치 번호(0, 1, 2…)로 값을 꺼냅니다. 라벨이 무엇이든 상관없이 "몇 번째"로 접근할 때 씁니다. 데이터프레임에서도 똑같이 쓰이니(11장) 기억해 두세요.

슬라이싱: 구간 잘라내기

NumPy 슬라이싱처럼 구간을 꺼냅니다. 단, 라벨로 슬라이싱하면 끝이 포함되고, 위치 번호로 하면 끝이 제외되는 차이가 있습니다.

PYTHON
import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=["a", "b", "c", "d", "e"])

print(s["a":"c"])     # 라벨 슬라이싱 → 'c' 포함!
print("---")
print(s.iloc[0:3])    # 위치 슬라이싱 → 3번 제외 (0,1,2)

실행 결과:

CODE
a    10
b    20
c    30
dtype: int64
---
a    10
b    20
c    30
dtype: int64
⚠️ 흔한 실수
이 차이를 꼭 기억하세요
  • 라벨 슬라이싱 s["a":"c"] → 끝("c") 포함
  • 위치 슬라이싱 s.iloc[0:3] → 끝(3) 제외

헷갈리기 쉬운 부분이라 처음엔 의식적으로 확인하는 습관이 좋습니다.

🛠 미니 챌린지

  1. 5개 도시의 인구 시리즈를 만들고, 인구가 많은 순으로 정렬해 출력하세요.
  2. 같은 시리즈에서 인구가 300(만) 이상인 도시만 골라내세요.
  3. 시리즈 [10, 20, 30, 40, 50](인덱스 a~e)에서 iloc로 처음 세 개를 슬라이싱하세요.

✅ 미니 챌린지 해설

PYTHON
import pandas as pd

# 1. 인구 정렬 (내림차순)
pop = pd.Series({"서울": 940, "부산": 330, "인천": 295,
                 "대구": 240, "광주": 150})
print(pop.sort_values(ascending=False))

실행 결과:

CODE
서울    940
부산    330
인천    295
대구    240
광주    150
dtype: int64
PYTHON
# 2. 조건으로 골라내기 (300 이상)
print(pop[pop >= 300])

실행 결과:

CODE
서울    940
부산    330
dtype: int64
PYTHON
# 3. iloc 슬라이싱 (0,1,2 → 3 제외)
s = pd.Series([10, 20, 30, 40, 50], index=["a","b","c","d","e"])
print(s.iloc[0:3])

실행 결과:

CODE
a    10
b    20
c    30
dtype: int64

이 장에서 배운 것

  • sort_values()(값)·sort_index()(인덱스)로 정렬하며, 원본은 바뀌지 않는다.
  • 벡터화로 시리즈 전체에 연산하고, 시리즈끼리는 같은 인덱스끼리 자동 계산된다.
  • 조건 선택 s[s > 80]으로 원하는 값만 골라낸다.
  • in인덱스를 확인하며, iloc위치 번호로 접근한다.
  • 라벨 슬라이싱은 끝을 포함하고, 위치 슬라이싱은 끝을 제외한다.

✍️ 확인 문제

  1. scores.sort_values()를 실행했는데 다음 줄에서 원본 scores가 그대로입니다. 왜인가요?
  2. "사과" in stock은 무엇을 확인하나요? 값인가요, 인덱스인가요?
  3. s["a":"c"]s.iloc[0:3]의 결정적 차이는 무엇인가요?
시리즈를 충분히 익혔습니다! 이제 시리즈를 여러 개 모은 2차원 표, 데이터프레임으로 넘어갑니다. 데이터 분석의 진짜 무대입니다.
👉 10. 데이터프레임이란 무엇인가