인덱스,시리즈,데이터프레임
| topics | |
| types | |
| tags |
#pandas #index #series #dataframe
|
| references |
인덱스, 시리즈, 데이터프레임
기본 개념 정리
| 구분 | 설명 | 구조 | 예시 |
|---|---|---|---|
| 인덱스(Index) | 행(또는 열)을 식별하는 라벨(label) | 1차원 라벨 | [0, 1, 2] 또는 ['a', 'b', 'c'] |
| 시리즈(Series) | 1차원 데이터 구조 (값 + 인덱스) | 1차원 | 0: 10, 1: 20, 2: 30 |
| 데이터프레임(DataFrame) | 2차원 데이터 구조 (시리즈 여러 개) | 2차원(표) | 행과 열이 있는 엑셀 같은 테이블 |
인덱스 (Index)
데이터의 각 행(또는 열)을 식별하는 역할을 하는 라벨이다.
특징
- 시리즈와 데이터프레임 모두 인덱스를 가진다
- 정수, 문자열, 날짜 등 다양한 형태 가능
- 데이터를 담지 않고, 식별·정렬·슬라이싱에 사용
예시
import pandas as pd
# 인덱스 예시
idx = pd.Index([0, 1, 2]) # 정수 인덱스
idx = pd.Index(['a', 'b', 'c']) # 문자열 인덱스
idx = pd.DatetimeIndex(['2024-01-01', '2024-01-02']) # 날짜 인덱스
시리즈 (Series)
1차원 데이터 구조로, 값과 인덱스로 구성된다.
왜 리스트 대신 시리즈를 쓸까?
리스트
- 값만 저장
- 순서로만 접근 (
list[0])
시리즈
- 값 + 라벨(인덱스) 저장
- 라벨로 접근 가능 (
series['a']) - 벡터 연산 지원
딕셔너리처럼 key-value 구조로도 볼 수 있지만, 순서가 있고 벡터 연산이 가능하다는 게 다르다.
시리즈 생성
# 리스트로 생성
s = pd.Series([10, 20, 30])
print(s)
# 0 10
# 1 20
# 2 30
# 인덱스 지정
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s)
# a 10
# b 20
# c 30
# 딕셔너리로 생성
s = pd.Series({'a': 10, 'b': 20, 'c': 30})
시리즈 → 데이터프레임 변환
s = pd.Series(
['4 cups', '1 cup', '2 large', '1 can'],
index=['Flour', 'Milk', 'Eggs', 'Spam'],
name='Dinner' # 이게 컬럼명이 됨
)
df = s.to_frame()
print(df)
# Dinner
# Flour 4 cups
# Milk 1 cup
# Eggs 2 large
# Spam 1 can
name 파라미터: 시리즈에 이름을 주면, 데이터프레임으로 변환할 때 컬럼명이 된다.
데이터프레임 (DataFrame)
2차원 데이터 구조로, 여러 개의 시리즈(열)가 모여서 만들어진다.
왜 필요한가?
엑셀 스프레드시트나 SQL 테이블 같은 구조
- 행과 열 모두 인덱스(라벨)를 가진다
- 각 열은 서로 다른 데이터 타입 가능
- 데이터 분석의 기본 단위
데이터프레임 생성
# 딕셔너리로 생성
df = pd.DataFrame({
'Apples': [30, 41],
'Bananas': [21, 34]
})
print(df)
# Apples Bananas
# 0 30 21
# 1 41 34
# 인덱스 지정
df.index = ['2017 Sales', '2018 Sales']
print(df)
# Apples Bananas
# 2017 Sales 30 21
# 2018 Sales 41 34
행 추가
# 새로운 행 추가
new_row = pd.DataFrame(<span class="dead-link" title="페이지 없음">45, 38</span>, columns=['Apples', 'Bananas'])
df = pd.concat([df, new_row], ignore_index=True)
데이터 접근
# 컬럼 접근 (시리즈 반환)
df['Apples']
# 특정 값 접근 (권장 방법: loc 사용)
df.loc['2017 Sales', 'Apples'] = 35
# 이렇게도 되긴 하지만 loc를 권장
# df['Apples']['2017 Sales'] = 35 # SettingWithCopyWarning 발생 가능
왜 loc를 써야 할까?
df['col']['row']방식은 체이닝이라 경고가 뜬다.loc는 명확하게 한번에 접근하므로 안전하다.
정리
차이점 요약
- 인덱스: 데이터의 위치를 식별하는 라벨 (1차원)
- 시리즈: 값 + 인덱스로 구성된 1차원 데이터 (컬럼 1개)
- 데이터프레임: 여러 시리즈(컬럼)를 모은 2차원 데이터 (행과 열, 각자 인덱스)
관계
데이터프레임 = 여러 개의 시리즈
시리즈 = 1개의 컬럼 + 인덱스
데이터프레임에서 하나의 컬럼을 선택 → 시리즈 반환
핵심: 데이터프레임에서 하나의 열을 선택하면 시리즈가 된다. 시리즈와 데이터프레임 모두 인덱스를 가진다는 게 공통점이다.
관련 문서
- 판다스 (pandas)
- DataFrame에서 데이터 접근