Pandas - 2. 데이터 구조

2025. 1. 24. 18:09프로그래밍 (확장)/Python-Pandas

Pandas는 데이터를 효율적으로 분석하고 조작하기 위해 두 가지 주요 데이터 구조인 SeriesDataFrame을 제공합니다. 이 문서에서는 초보자도 쉽게 이해할 수 있도록 각 데이터 구조의 정의, 생성 방법, 속성, 활용 방법을 예제와 함께 상세히 설명합니다.


1. Series

1.1 Series의 정의와 특성

  • 정의: Series는 1차원 데이터 구조로, 값(value)과 인덱스(index)의 결합 형태입니다.
  • 특성:
    • Python의 리스트, 딕셔너리, Numpy 배열과 유사하지만, 데이터에 레이블(index)을 부여할 수 있는 강력한 기능을 제공합니다.
    • 같은 데이터 타입의 값들의 집합이며, 인덱스를 통해 데이터 접근이 용이합니다.

1.2 Series 생성 방법

1. 리스트로 생성

import pandas as pd

# 리스트를 이용한 Series 생성
data = [10, 20, 30]
series = pd.Series(data)
print(series)

출력:

0    10
1    20
2    30
dtype: int64

2. 딕셔너리로 생성

# 딕셔너리를 이용한 Series 생성
data = {'a': 10, 'b': 20, 'c': 30}
series = pd.Series(data)
print(series)

출력:

a    10
b    20
c    30
dtype: int64

3. Numpy 배열로 생성

import numpy as np

# Numpy 배열을 이용한 Series 생성
data = np.array([1.1, 2.2, 3.3])
series = pd.Series(data)
print(series)

출력:

0    1.1
1    2.2
2    3.3
dtype: float64

1.3 Series의 속성

  • index: Series의 인덱스를 반환합니다.
  • values: Series의 값을 배열로 반환합니다.
  • dtype: 데이터의 자료형을 반환합니다.

예제:

print(series.index)   # RangeIndex(start=0, stop=3, step=1)
print(series.values)  # [1.1 2.2 3.3]
print(series.dtype)   # float64

1.4 Series의 연산 및 활용

1. 벡터화 연산

# 수치 연산
series = pd.Series([1, 2, 3])
result = series * 10
print(result)

출력:

0    10
1    20
2    30
dtype: int64

2. 조건 필터링

# 조건에 따른 필터링
filtered = series[series > 1]
print(filtered)

출력:

1    2
2    3
dtype: int64

1.5 Series와 DataFrame 간 변환

1. Series를 DataFrame으로 변환

series = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
df = series.to_frame(name='Values')
print(df)

출력:

   Values
a      10
b      20
c      30

2. DataFrame에서 Series 추출

data = {'col1': [1, 2, 3], 'col2': [4, 5, 6]}
df = pd.DataFrame(data)
series = df['col1']
print(series)

출력:

0    1
1    2
2    3
Name: col1, dtype: int64

2. DataFrame

2.1 DataFrame의 정의와 특성

  • 정의: DataFrame은 2차원 데이터 구조로, 행(row)과 열(column)로 구성됩니다.
  • 특성:
    • 여러 Series가 모여 구성된 형태입니다.
    • 각 열은 동일한 데이터 타입을 가지며, 서로 다른 열은 다른 데이터 타입을 가질 수 있습니다.
    • 데이터를 테이블 형식으로 표현하며, 엑셀이나 데이터베이스 테이블과 유사합니다.

2.2 DataFrame 생성 방법

1. 딕셔너리로 생성

# 딕셔너리를 이용한 DataFrame 생성
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)
print(df)

출력:

      Name  Age         City
0    Alice   25     New York
1      Bob   30  Los Angeles
2  Charlie   35      Chicago

2. Numpy 배열로 생성

import numpy as np

# Numpy 배열을 이용한 DataFrame 생성
data = np.array([[1, 2], [3, 4], [5, 6]])
df = pd.DataFrame(data, columns=['A', 'B'])
print(df)

출력:

   A  B
0  1  2
1  3  4
2  5  6

3. CSV 파일로 생성

# CSV 파일 읽기 (에러 처리 포함)
try:
    df = pd.read_csv('example.csv', encoding='utf-8')
    print(df)
except FileNotFoundError as e:
    print(f"에러 발생: {e}")

2.3 DataFrame의 속성

  • shape: 행과 열의 크기
  • columns: 열 이름
  • index: 인덱스 확인

예제:

print(df.shape)    # (3, 3)
print(df.columns)  # Index(['A', 'B'], dtype='object')
print(df.index)    # RangeIndex(start=0, stop=3, step=1)

2.4 DataFrame과 Series의 메모리 관리

메모리 최적화 효과 예제

import numpy as np

# 메모리 최적화 효과 확인
df = pd.DataFrame({'A': np.random.randint(0, 100, 10000)})
print(f"최적화 전: {df.memory_usage(deep=True).sum()} bytes")

df['A'] = pd.to_numeric(df['A'], downcast='integer')
print(f"최적화 후: {df.memory_usage(deep=True).sum()} bytes")

3. Index 객체 심화 활용

3.1 Index 객체의 특성 및 활용

  • Index 객체는 DataFrame과 Series의 행 레이블을 관리하며, 고유성을 보장합니다.
  • 불변(immutable) 속성을 가지며, 데이터 무결성을 유지합니다.

예제:

print(df.index)            # RangeIndex(start=0, stop=3, step=1)
print(df.index.is_unique)  # True

3.2 MultiIndex 생성 및 관리

MultiIndex 생성

arrays = [['A', 'A', 'B'], [1, 2, 1]]
index = pd.MultiIndex.from_arrays(arrays, names=('Group', 'Number'))
data = [10, 20, 30]
series = pd.Series(data, index=index)
print(series)

출력:

Group  Number
A      1         10
       2         20
B      1         30
dtype: int64