Pandas - [1단계] 판다스 기초 다지기

c.haha.e·2025년 8월 12일

STUDY

목록 보기
3/27

Pandas의 데이터 구조

(1) Series

  • 1차원 데이터 (1개 열)
  • IndexValue 쌍으로 이루어짐
  • 리스트와 딕셔너리의 중간 형태
  • index: 값의 인덱스(행 번호/이름)
  • values: 실제 데이터 값 배열
  • name: "그 Series의 이름" (ex. 컬럼명 역할)
    • 예: df['매출']은 Series, name은 '매출'
  • dtype: 데이터 타입
import pandas as pd

s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
# a    10
# b    20
# c    30
# d    40
# dtype: int64

print(s.index)    # Index(['a', 'b', 'c', 'd'], dtype='object')
print(s.values)   # [10 20 30 40]

(2) DataFrame

  • 2차원 표(엑셀 테이블 느낌)
  • 행(row), 열(column) 모두에 index 부여 가능
  • columns: 컬럼(열)들의 이름 집합 (ex. ['A', 'B', 'C'])
  • index: 행 인덱스(행 번호/이름)
  • values: 2차원 배열 데이터
  • dtypes: 각 컬럼의 타입
data = {'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 35],
        'score': [85, 90, 95]}
df = pd.DataFrame(data)
print(df)
#      name  age  score
# 0   Alice   25     85
# 1     Bob   30     90
# 2  Charlie   35     95

print(df.index)    # RangeIndex(start=0, stop=3, step=1)
print(df.columns)  # Index(['name', 'age', 'score'], dtype='object')
print(df.values)   
# [['Alice' 25 85]
# ['Bob' 30 90]
# ['Charlie' 35 95]]

Series vs DataFrame 차이

구분SeriesDataFrame
차원1차원(열 1개)2차원(행, 열)
인덱스index만index + columns
활용한 컬럼 또는 배열여러 컬럼, 표 전체
  • .dtype vs .dtypes – 차이, 언제 어떻게 쓰나?

    1. .dtype

    • “단일 Series(한 컬럼)”의 데이터 타입을 알려주는 속성

    • 결과: 스칼라값(하나의 타입, 예: int64, float64, object, bool 등)

      ● 예시

      import pandas as pd
      
      df = pd.DataFrame({'A':[1,2,3], 'B':[1.5,2.2,3.1], 'C':['a','b','c']})
      
      print(df['A'].dtype)      # int64
      print(df['B'].dtype)      # float64
      print(df['C'].dtype)      # object
    • Series에서만 의미 있음

    • DataFrame에서 쓸 경우, 전체 DataFrame의 “공통 dtype”이 있으면 그걸 반환(대부분의 경우 의미 없음)

      ## 1. **모든 컬럼의 dtype이 같을 때 – `.dtype` 예시**
      
      ```python
      python
      복사편집
      import pandas as pd
      
      # 모든 컬럼이 int64인 경우
      df = pd.DataFrame({
          'A': [1, 2, 3],
          'B': [4, 5, 6],
          'C': [7, 8, 9]
      })
      
      print(df.dtype)     # 모든 컬럼의 dtype이 동일하면
      # 결과: int64
      
      ```
      
      - 즉, “3개 컬럼이 전부 int64니까 int64”
      
      ---
      
      ## 2. **컬럼의 dtype이 다를 때 – `.dtype` 예시**
      
      ```python
      df2 = pd.DataFrame({
          'A': [1, 2, 3],            # int64
          'B': [4.0, 5.0, 6.0],      # float64
          'C': ['a', 'b', 'c']       # object (문자열)
      })
      
      try:
          print(df2.dtype)
      except Exception as e:
          print(type(e).__name__, e)
      ```
      
      - **실행 결과:**
      
      ```
      AttributeError 'DataFrame' object has no attribute 'dtype'
      ```
      
      - **오류 발생!**
      - DataFrame에서 **컬럼별 dtype이 다르면 .dtype은 아예 쓸 수 없음**
      - 그래서 **실무에서는 DataFrame엔 항상 `.dtypes`만 사용!**
      
      ---
      
      ## 3. **정리**
      
      - **DataFrame에서 .dtype**
          - **전 컬럼 dtype이 완전히 같으면** 그 dtype 반환 (ex. int64)
          - **한 컬럼이라도 다르면** AttributeError (오류 발생)
          - 실무에서는 거의 의미 없음
      - *항상 DataFrame은 `.dtypes`*로 컬럼별 타입을 체크!
      
      ---
      
      ## 4. **실전 요약**
      
      ```python
      print(df.dtypes)
      # A    int64
      # B    float64
      # C    object
      # dtype: object
      ```
      
      ---
      
      # 결론
      
      > DataFrame['컬럼']에는 .dtype (한 개 컬럼이니까!)
      > 
      > 
      > **DataFrame 전체엔 .dtypes (여러 컬럼, 다양한 타입!)**
      > 
      
      > DataFrame에서 .dtype은 거의 쓸 일 없다!
      > 

      2. .dtypes

    • DataFrame 전체의 “각 컬럼별 데이터 타입을 알려주는 속성

    • 결과: Series 형태의 여러 타입

      ● 예시

      print(df.dtypes)
      # A     int64
      # B   float64
      # C    object
      # dtype: object
    • DataFrame에서만 의미 있음

    • 각 컬럼별로 타입이 다를 수 있기 때문에 여러 타입을 한 번에 보여줌


      3. 정리표

      속성대상반환 값사용 예시
      .dtypeSeries단일 타입 (ex. int64)df['A'].dtype
      .dtypesDataFrameSeries(여러 타입)df.dtypes

      4. 실무 팁

    • 데이터 타입 점검 → 항상 DataFrame엔 .dtypes,
      컬럼/Series엔 .dtype!

    • 머신러닝/통계 전처리 시,
      각 컬럼의 타입 한 번에 보고 싶을 땐 .dtypes

    • 특정 컬럼의 타입 확인/조건문엔 .dtype

      결론

      .dtype: 한 컬럼/Series의 타입

      .dtypes: 전체 DataFrame의 컬럼별 타입

      “s” 하나 차이지만,

      단일(컬럼/Series) vs 전체(DataFrame) 구분해서 써야 한다!


데이터 읽고 쓰기 (입출력 함수)

(1) CSV 파일 읽기/쓰기

  • 외부 파일에서 바로 읽어 DataFrame으로 변환
# 읽기
df = pd.read_csv('data.csv')
print(df.head())   # 앞 5행 출력

# 쓰기
df.to_csv('output.csv', index=False, encoding='utf-8-sig')  # 인덱스 없이 저장
  • 옵션
    • index=False: 행 인덱스 저장 안 함
    • encoding='utf-8-sig': 한글 깨짐 방지

(2) 엑셀 파일 읽기/쓰기

# 읽기
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')  # 시트 이름 지정 가능

# 쓰기
df.to_excel('output.xlsx', index=False)

(3) 기타 파일 (JSON, SQL 등)

  • read_json(), read_sql(), read_html() 등 다양한 데이터 소스 지원
# JSON 읽기
df = pd.read_json('data.json')

(4) DataFrame 직접 생성

data = {
    'col1': [1, 2, 3],
    'col2': ['a', 'b', 'c']
}
df = pd.DataFrame(data)
  • Key: 컬럼명
  • Value: 각 컬럼의 값(리스트/배열 등, 길이 맞춰야 함)
import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'score': [85, 90, 95]
}

df = pd.DataFrame(data)
print(df)
#      name  age  score
# 0   Alice   25     85
# 1     Bob   30     90
# 2  Charlie   35     95
  • 인덱스는 자동으로 0, 1, 2... 부여
  • 직접 지정하고 싶으면 index= 옵션 사용
df = pd.DataFrame(data, index=['a', 'b', 'c'])

리스트(또는 배열)의 딕셔너리로 만들기

  • 각 행을 dict로 만들어 리스트에 저장
  • 각 dict의 key가 컬럼명, value가 값
data = [
    {'name': 'Alice', 'age': 25, 'score': 85},
    {'name': 'Bob', 'age': 30, 'score': 90},
    {'name': 'Charlie', 'age': 35, 'score': 95}
]

df = pd.DataFrame(data)
print(df)
  • 빠진 컬럼은 NaN으로 채워짐

2차원 리스트(혹은 배열) + 컬럼명/인덱스 지정

  • : 2차원 리스트
  • columns: 컬럼명
  • index: 인덱스명
data = [
    [25, 85],
    [30, 90],
    [35, 95]
]

df = pd.DataFrame(data, columns=['age', 'score'], index=['a', 'b', 'c'])
print(df)

Series로부터 DataFrame 만들기

  • 여러 Series를 합치면 DataFrame 완성
s1 = pd.Series([1, 2, 3], name='a')
s2 = pd.Series([4, 5, 6], name='b')
df = pd.DataFrame({s1.name: s1, s2.name: s2})
print(df)

numpy 2차원 배열로 만들기

import numpy as np

arr = np.array([[1, 2], [3, 4]])
df = pd.DataFrame(arr, columns=['col1', 'col2'], index=['row1', 'row2'])
print(df)

컬럼/인덱스 직접 바꾸기

df.columns = ['A', 'B', 'C']
df.index = ['row1', 'row2', 'row3']

9. DataFrame의 주요 속성


주요 속성 정리

  • index: 행 레이블
  • columns: 열 레이블
  • values: 실제 데이터 (numpy 배열)
  • dtypes: 각 열의 데이터 타입
print(df.index)
print(df.columns)
print(df.values)
print(df.dtypes)

핵심 요약 표

속성/메서드역할/설명주로 사용되는 상황
df.index행 인덱스 정보인덱스 재설정, 행 단위 연산
df.columns컬럼명 정보컬럼명 변경, 컬럼 단위 연산
df.values순수 값(넘파이 배열)ML 등 넘파이 변환
df.dtypes컬럼별 데이터 타입타입 체크, 변환
df.shape(행, 열) 튜플데이터 크기 확인
df.info()전체 구조/요약데이터 전체 개요 파악
df.describe()숫자 컬럼 통계데이터 분포, 요약
df.head()/tail()앞뒤 n행 미리보기구조, 패턴 확인
df.T행/열 전치행/열 변환 필요할 때

profile
기록용 블로그

0개의 댓글