별의 공부 블로그 🧑🏻‍💻
728x90
728x170

판다스 데이터 구조

  • 판다스는 계층적으로 넘파이(NumPy) 바로 위에 위치하며, 시리즈(Series)데이터프레임(DataFrame) 데이터 구조를 지원함으로써 데이터를 빠르게 처리한다.
차원 이름 설명
1 시리즈(Series) 라벨 표시된 1차원의 동일한 형태의 배열
2 데이터프레임(DataFrame) - 동일하지 않은 형태을 가짐.
- 라벨 표시된 2차원의, 크기 변동이 가능한 테이블형 구조

 

  • 판다스 데이터 구조는 저차원 데이터를 유연하게 포함하는 컨테이너이다.
  • 따라서 데이터프레임시리즈의 컨테이너이고, 시리즈스칼라의 컨테이너이다.
  • 딕셔너리 데이터에서 적용하는 방법을 이용해 이들 컨테이너에 객체들을 넣거나 지울 수 있다.
  • 판다스를 사용하기 위해 다음의 모듈을 임포트(Import) 한다.
# 넘파이(NumPy) 라이브러리 불러오기
import numpy as np

# 판다스(Pandas) 라이브러리 불러오기
import pandas as pd

 

  • pd 를 사용하고 싶지 않다면 다음과 같이 입력한다.
from pandas import Series, DataFrame

 

  • 다음 명령을 입력하여 판다스의 버전을 확인할 수 있다.
print(pd.__version__)
더보기
1.3.4

 

시리즈(Series)

  • 정수, 문자열, 실수 또는 파이썬 객체 등의 데이터 형식을 가질 수 있는, 라벨 표시된 일차원 배열
  • 시리즈 객체는 데이터와 데이터의 인덱스를 나타내는 라벨의 배열을 포함하는 컨테이너이다.
  • 다음과 같이 호출하여 사용할 수 있다.
ser = pd.Series(data, index=index)

 

  • data
    • 파이썬 딕셔너리형
    • ndarray 
    • 스칼라
  • index
    • 축 라벨의 리스트

 

시리즈 객체 생성 방법

  • 시리즈 객체는 크게 3가지 방법으로 생성할 수 있다.

 

① ndarray에서 시리즈 객체를 생성하는 방법

  • 데이터가 ndarray 라면 이때 index데이터와 같은 길이여야 한다.
  • index가 전달되지 않으면, 값은 [0, ..., len(data)-1]과 같이 생성된다.
ser = pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd'])
ser
더보기
a    1.396620
b   -0.129831
c    1.818473
d    0.892283
dtype: float64

 

  • 클래스 객체인 pandas.Series의 속성 values index를 이용해 각 값을 구할 수 있다.
ser.values
더보기
array([ 1.39661962, -0.12983117,  1.81847307,  0.8922827 ])

 

ser.index
더보기
Index(['a', 'b', 'c', 'd'], dtype='object')

 

② 딕셔너리 데이터에서 시리즈 객체를 생성하는 방법

da = {'seoul' : 2000, 'busan' : 2500, 'daejeon' : 3000}
pd.Series(da)
더보기
seoul      2000
busan      2500
daejeon    3000
dtype: int64

 

  • 다음과 같이 인덱스를 전달하면 인덱스의 라벨에 상응하는 da 데이터에 값을 적용해 반환한다.
da = {'a' : 0., 'b' : 1., 'c' : 2.}
pd.Series(da)
더보기
a    0.0
b    1.0
c    2.0
dtype: float64

 

  • NaN(Not a Number) : 판다스에서 사용하는 표준 손실 값 표시자
pd.Series(da, index=['b', 'c', 'd', 'a'])
더보기
b    1.0
c    2.0
d    NaN
a    0.0
dtype: float64

 

③ 스칼라 값에서 시리즈 객체를 생성하는 방법

  • 스칼라 데이터에서 시리즈 객체를 생성할 때는 라벨 표시를 위한 인덱스를 입력한다.
pd.Series(7., index=['a', 'b', 'c'])
더보기
a    7.0
b    7.0
c    7.0
dtype: float64

 

ndarray와의 유사성

  • 시리즈는 ndarray와 매우 비슷하며, 넘파이 함수의 인수로 적용할 수 있다.
  • 또한 슬라이싱 같은 연산을 수행할 수 있다.
ser[0]
더보기
1.3966196208161945

 

ser[:3]
더보기
a    1.396620
b   -0.129831
c    1.818473
dtype: float64

 

np.exp(ser)
더보기
a    4.041515
b    0.878244
c    6.162442
d    2.440695
dtype: float64

 

딕셔너리와의 유사성

  • 시리즈는 인덱스 라벨로 값을 얻고 설정할 수 있다는 점에서 고정된 크기의 딕셔너리와 같다.
  • 또한, 다음과 같이 ser 객체의 요소에 새로운 값을 동적 할당해 변경할 수 있다.
ser['a']
더보기
1.3966196208161945

 

ser['d']
더보기
0.8922827028273252

 

ser
더보기
a    1.396620
b   -0.129831
c    1.818473
d    0.892283
dtype: float64

 

넘파이와의 유사성

  • 시리즈 객체도 넘파이처럼 산술 연산을 할 수 있다.
ser + ser
더보기
a    2.793239
b   -0.259662
c    3.636946
d    1.784565
dtype: float64

 

ser * 2
더보기
a    2.793239
b   -0.259662
c    3.636946
d    1.784565
dtype: float64

 

  • 시리즈를 연산하면 라벨에 기반해 데이터를 자동 정렬한다는 점에서 ndarray와 차이가 있다.
ser[1:] + ser[:-1]
더보기
a         NaN
b   -0.259662
c    3.636946
d         NaN
dtype: float64

 

  • 정렬되지 않은 시리즈 간 연산을 수행할 경우, 포함된 인덱스들의 합이 결과로 나타난다.
  • 시리즈들을 연산할 때 한 시리즈나 다른 시리즈에서 라벨이 발견되지 않으면 결과는 NaN으로 표시된다.

 

시리즈 이름 설정과 변경

  • 시리즈에 name 속성과 rename() 메소드를 적용하면 시리즈 이름을 설정하고 변경할 수 있다.
ser = pd.Series(np.random.randn(5), name='seoul')
ser
더보기
0    0.705889
1   -0.721955
2    0.702729
3    0.791814
4    0.469885
Name: seoul, dtype: float64

 

ser1 = ser.rename("busan")
ser1.name
더보기
'busan'

 

 

데이터프레임(DataFrame)

  • 가장 일반적인 판다스 객체이며, 서로 다른 타입로 구성되고 2차원 행 및 열 라벨을 가진다.
  • 데이터프레임 객체는 시리즈 객체가 갖는 속성메소드들을 공유한다.
  • 데이터프레임 객체는 여러 시리즈 객체를 모아놓은 객체라고 할 수 있다.
  • 데이터프레임은 행과 열이 정렬된 데이터로 이루어져 있다.
  • 시리즈와 마찬가지로, 데이터프레임에는 다음과 같은 형태의 데이터를 입력할 수 있다.
    • 1차원 ndarrays, 리스트, 딕셔너리 또는 시리즈의 딕셔너리
    • 2차원 ndarray
    • 시리즈 또는 또 다른 데이터프레임
  • 데이터에 따라 행 라벨인덱스열 라벨열 인수들을 옵션으로 설정할 수 있다.
    • 그런 경우, 처리된 데이터프레임의 인덱스 또는 열을 생성한다.

 

딕셔너리에서 데이터프레임 객체 생성

  • 딕셔너리에서 인덱스로 생성한 데이터프레임은 여러 시리즈 인덱스들의 합집합(Union)이다.
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
        'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
df

 

  • 데이터프레임 객체 df에 대한 정보는 info() 메소드를 사용해 확인할 수 있다.
  • pandas.DataFrame.info 메소드는 인덱스 dtype, 열 dtype, non-null 값 및 사용된 메모리 크기를 포함하여 데이터프레임에 대한 정보를 출력한다.
df.info()
더보기
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, a to d
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   one     3 non-null      float64
 1   two     4 non-null      float64
dtypes: float64(2)
memory usage: 96.0+ bytes

 

df.dtypes
더보기
one    float64
two    float64
dtype: object

 

  • 인덱스열 라벨 순서를 변경할 수 있다.
pd.DataFrame(d, index=['d', 'b', 'a'])

 

pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])

 

  • 인덱스와 열 속성을 이용해 각 행과 열 라벨에 접근할 수 있다.
df.index
더보기
Index(['a', 'b', 'c', 'd'], dtype='object')

 

df.columns
더보기
Index(['one', 'two'], dtype='object')

 

ndarrays나 리스트의 딕셔너리에서 데이터프레임 객체 생성

  • 다음으로 리스트의 딕셔너리에서 데이터프레임 객체를 생성한다.
d = {'one' : [1., 2., 3.], 'two' : [3., 2., 1.]}

pd.DataFrame(d)

 

pd.DataFrame(d, index=['a', 'b', 'c'])

 

구조화된 배열 또는 레코드 배열에서 데이터프레임 객체 생성

  • 배열이 ndarray 객체인 구조화된 배열에서 데이터프레임 객체를 생성한다.
arr = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])

arr[:] = [(1, 2., 'Hello'), (2, 3, 'World')]

arr
더보기
array([(1, 2., b'Hello'), (2, 3., b'World')],
      dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

 

pd.DataFrame(arr)

 

pd.DataFrame(arr, index=['first', 'second'])

 

pd.DataFrame(arr, columns=['C', 'A', 'B'])

 

딕셔너리의 리스트에서 데이터프레임 객체 생성

  • 딕셔너리의 리스트에서 데이터프레임 객체를 생성하고, 특정 열을 선택해본다.
data = [{'a' : 1, 'b' : 2}, {'a' : 5, 'b' : 10, 'c' : 20}]
pd.DataFrame(data)

 

pd.DataFrame(data, columns=['a', 'b'])

 

튜플의 딕셔너리에서 데이터프레임 객체 생성

  • 튜플의 딕셔너리에서 데이터프레임 객체를 생성할 수 있다.
pd.DataFrame({('a', 'b') : {('A', 'B') : 1, ('A', 'C') : 2},
             ('a', 'a') : {('A', 'C') : 1, ('A', 'B') : 4},
             ('a', 'c') : {('A', 'B') : 1, ('A', 'C') : 6},
             ('b', 'a') : {('A', 'C') : 1, ('A', 'B') : 8},
             ('b', 'b') : {('A', 'D') : 1, ('A', 'B') : 10}})

 

데이터프레임 생성자

  • DataFrame.form_dict 생성자(Constructor)를 이용해 데이터프레임 객체를 생성할 수 있다.
  • 이 생성자는 딕셔너리 또는 유사 배열 시퀀스인 리스트가 있는 dict()를 입력으로 받아서 데이터프레임을 반환한다.
dict([('A', [1, 2, 3]), ('B', [4, 5, 6])])
더보기
{'A': [1, 2, 3], 'B': [4, 5, 6]}

 

pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))

 

  • 생성자에 orient='index'를 전달하면 키인 A와 B는 행 라벨이 된다.
  • columns에는 원하는 열 이름을 전달할 수 있다.
pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), orient='index', columns=['one', 'two', 'three'])

 

  • 클래스 객체인 DataFrame.from_records 생성자를 이용해 데이터프레임 객체를 생성할 수 있다.
  • 이 생성자에는 튜플의 리스트 또는 구조화된 dtypendarray를 입력할 수 있다.
arr
더보기
array([(1, 2., b'Hello'), (2, 3., b'World')],
      dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

 

pd.DataFrame.from_records(arr, index='C')

 

 

행과 열의 기본 처리

  • 데이터프레임은 행과 열의 테이블 형태인 2차원 배열 데이터 구조를 가진다.
  • 이런 데이터를 처리한다는 것은 행과 열을 선택하고, 지우고, 산술 연산을 하고, 이름을 부여하는 등 기본적인 처리를 하는 것 을 의미한다.

 

행 또는 열 선택, 추가, 삭제

  • 데이터프레임에서는 딕셔너리형을 연산하는 것과 같은 방법으로 열을 선택하고, 추가하고, 지울 수 있다.
df['one']
더보기
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

 

df['two']
더보기
a    1.0
b    2.0
c    3.0
d    4.0
Name: two, dtype: float64

 

df['three'] = df['one'] * df['two']
df['flag'] = df['one'] > 2
df

 

  • 열은 삭제할 수 있다.
  • pandas.DataFrame.pop 메소드를 이용해 프레임에서 열을 추출하고 그 요소를 시리즈로 반환할 수 있다.
del df['two']    # 열 삭제

df.pop('three')
더보기
a    1.0
b    4.0
c    9.0
d    NaN
Name: three, dtype: float64

 

df

 

  • 데이터프레임에 스칼라 값동적 할당하면 브로드캐스팅으로 열을 채운다.
df['ha'] = 'hiho'
df

 

  • 데이터프레임과 다른 인덱스를 가진 시리즈를 삽입할 때는 데이터프레임의 인덱스에 맞춘다.
df['trunced_one'] = df['one'][:2]
df
  • df['one'][:2]시리즈 객체(pandas.core.series.Series) 타입이다.

 

  • DataFrame.insert 함수를 사용하면 데이터프레임의 특정 위치에 열을 삽입할 수 있다.
df.insert(1, 'hi', df['one'])    # 1: 두번째 열, hi: 삽입할 열 라벨, df['one']: 삽입할 값(시리즈형)
df

 

  • pandas.Series.drop 함수를 이용하면 인덱스 라벨을 기준으로 시리즈의 요소를 제거하며 요소를 제거한 시리즈 객체를 결과로 반환한다.
ser = pd.Series(data=np.arange(3), index=['A', 'B', 'C'])
ser
더보기
A    0
B    1
C    2
dtype: int32

 

ser.drop(labels=['B', 'C'])
더보기
A    0
dtype: int32

 

인덱싱과 선택

  • 기본적인 인덱싱 적용 방법은 다음과 같다.
적용 방법 구문 결과 타입
열 선택 df[col] Series
라벨로 행 선택 df.loc[label] Series
정수 위치로 행 선택 df.iloc[loc] Series
행 슬라이스 df[5:10] DataFrame
불리언 벡터로 행 선택 df[bool_vec] DataFrame

 

pandas.DataFrame.loc와 pandas.DataFrame.iloc

  • DataFrame.loc[] 속성
    • 라벨이나 불리언 배열을 이용해 행과 열 그룹에 접근한다.
    • 다음과 같은 형태를 입력할 수 있다.
      • 5 또는 a와 같은 단일 라벨
      • ['a', 'b', 'c']와 같은 리스트나 라벨의 배열
      • a:1와 같이 라벨이 있는 처음과 끝의 범위를 포함하는 슬라이스 객체
      • [True, False, True]와 같이 슬라이싱할 축과 같은 길이의 불리언 배열
      • 호출하는 시리즈나 데이터프레임을 인수로 가지는 호출 함수
  • DataFame.iloc[] 속성
    • 주로 축 정수 위치(축의 0부터 length-1까지)와 함께 사용하지만, 불리언 배열도 사용할 수 있다.
    • 다음과 같은 형태의 데이터를 입력할 수 있다.
      • 정수
      • [4, 3, 0]과 같은 리스트나 정수들의 배열
      • 1:7과 같은 정숫값을 가지는 슬라이스 객체
      • 불리언 배열
      • 호출하는 시리즈나 데이터프레임을 인수로 가지는 호출 함수

 

df.loc['b']
더보기
one              2.0
hi               2.0
flag           False
ha              hiho
trunced_one      2.0
Name: b, dtype: object

 

  • 행을 선택하면 시리즈를 반환하는데, 이때 시리즈의 인덱스가 데이터프레임의 열이다.
df.iloc[2]
더보기
one             3.0
hi              3.0
flag           True
ha             hiho
trunced_one     NaN
Name: c, dtype: object

 

데이터 정렬 및 산술 연산

  • 데이터프레임 객체 간 연산을 실행하면, 이들 객체의 행과 열을 기준으로 자동으로 정렬된다.
df = pd.DataFrame(np.random.randn(5, 4), columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(np.random.randn(3, 3), columns=['A', 'B', 'C'])
df + df2

 

  • 데이터프레임과 시리즈 간 연산을 실행할 때는 데이터프레임 열에 시리즈 인덱스를 정렬한다.
    • 이것은 행 방향으로 브로드캐스팅하는 것과 같다.
df - df.iloc[0]

 

  • 데이터프레임과 스칼라 간 연산은 다음과 같이 실행된다.
df * 10 + 2

 

  • 불리언 연산자는 다음과 같이 적용된다.
df1 = pd.DataFrame({'a' : [1, 0, 1], 'b' : [0, 1, 1]}, dtype=bool)
df2 = pd.DataFrame({'a' : [0, 1, 1], 'b' : [1, 1, 0]}, dtype=bool)

df1

 

df2

 

df1 & df2

 

df1 | df2

 

df1 ^ df2

 

-df1

 

전치

  • 행과 열을 전치(Transpose)하려면 ndarray에서 사용한 것과 같이 T 속성을 적용한다.
df[:2]

 

df[:2].T

 

넘파이 함수들과 데이터프레임 연동

  • log, exp, sqrt 넘파이 유니버셜 함수와 다른 넘파이 함수들을 데이터프레임과 연동해 사용할 수 있다.

 

df3 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['A', 'B', 'C', 'D'])

np.exp(df3)

 

np.asarray(df3)
더보기
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

 

인덱스 관련 객체

  • 판다스에서는 다음을 인덱스 관련 객체로 정한다.
    • Index
    • RangeIndex
    • CategoricalIndex
    • MultiIndex
    • IntervalIndex
    • DatetimeIndex
    • TimedeltaIndex
    • PeriodIndex
    • Int64Index
    • UInt64Index
    • Float64Index
  • 이러한 인덱스 객체들은 순서가 있고 자를 수 있는 세트(Set)를 연산 처리하는 불변(Immutable) ndarray이다.
  • 인덱스 객체들은 넘파이 배열과 유사하며, 넘파이 배열 객체가 가진 많은 속성을 사용할 수 있다.

 

>>> ind = pd.Index([1, 3, 5, 7, 9, 11])
>>> ind

Int64Index([1, 3, 5, 7, 9, 11], dtype='int64')

>>> ind[::2]
Int64Index([1, 5, 9], dtype='int64')

>>> ind.ndim, ind.shape
(1, (6,))

>>> ind[1] = 6
TypeError: Index does not support mutable operations
  • 동적 할당으로 두 번째 위치 요소를 6으로 변경하려 했으나 오류가 발생했다.
    • 인덱스 객체변경 불가능한 특성은 다양한 데이터 연산을 안전하고 신뢰성 있게 처리할 수 있도록 한다.
      • 넘파이 배열 판다스 인덱스 객체의 차이점

 

pandas.Index 클래스

  • 순서가 정렬된 요솟값을 가지며, 요솟값은 자를 수 있지만 불변 ndarray 이다.
  • 모든 판다스 객체들의 축 라벨을 저장하기 위한 기본 객체
>>> pd.Index([1, 2, 3])
Int64Index([1, 2, 3], dtype='int64')

>>> pd.Index(list('abc'))
Index(['a', 'b', 'c'], dtype='object')

 

pandas.RangleIndex 클래스

  • 정수 범위에서 실행하는 불변 인덱스이다.
  • 제한된 메모리에 변하지 않는 범위의 데이터를 저장하는 특수한 Int64Index
  • 데이터프레임과 시리즈에 명시적인 인덱스를 제공하지 않을 때 기본적으로 사용하는 인덱스 타입
df = pd.DataFrame(np.arange(12).reshape(2, 6), columns=list('ABCDEF'))
df

 

df.index
더보기
RangeIndex(start=0, stop=2, step=1)

 

Int64Index, Uint64Index, Float64Index 클래스

  • Int64Index 클래스
    • 모든 판다스 객체의 축 라벨을 저장하기 위한 기본 객체
    • 순수하게 정수 라벨을 갖는 특별한 인덱스
    • 64비트 정수의 불변 배열을 나타낸다.
    • 인덱스를 명시하지 않거나 정수를 사용할 때의 기본 인덱스 타입
  • Uint64Index 클래스
    • 순서가 정렬되고 자를 수 있는 데이터 세트를 실행할 수 있는 불변 ndarray
    • 모든 판다스 객체의 축 라벨을 저장하는 기본 객체
    • 부호가 할당되지 않은 정수 라벨을 가진 경우 사용되는 특별한 인덱스
  • Float64Index 클래스
    • 순서가 정렬되고 자를 수 있는 데이터 세트를 실행할 수 있는 불변 ndarray
    • 모든 판다스 객체의 축 라벨을 저장하는 기본 객체
    • 실수 라벨을 가진 경우 사용되는 특별한 인덱스

 

pandas.CategoricalIndex 클래스

  • CategoricalIndex 클래스 범주(Categorical)를 갖는 산재한 인덱스를 나타낸다.
  • 판다스에서 데이터 타입이 범주형이라는 것은 통계학의 범주형 변수와 상응하는 데이터 타입이라는 의미이다.
  • 성별, 혈액형, 학년, 출신지, 국적, 주식 시장에서 회사 명칭을 나타내는 심벌 등은 반복적이면서 범위가 제한되어 있는데, 판다스는 이러한 텍스트 데이터 분류들을 수식 연산처럼 처리할 수 있는 기능을 제공한다.
  • 이러한 문자열 변수를 범주형 변수로 변환하면 사용 메모리를 절약할 수 있다.
ser = pd.Series(['ha', 'hi'] * 1000)
ser
더보기
0       ha
1       hi
2       ha
3       hi
4       ha
        ..
1995    hi
1996    ha
1997    hi
1998    ha
1999    hi
Length: 2000, dtype: object

 

ser.nbytes
더보기
16000

 

ser.astype('category')
더보기
0       ha
1       hi
2       ha
3       hi
4       ha
        ..
1995    hi
1996    ha
1997    hi
1998    ha
1999    hi
Length: 2000, dtype: category
Categories (2, object): ['ha', 'hi']

 

ser.astype('category').nbytes
더보기
2016

 

Pandas.Categorical 클래스

>>> s1 = pd.Categorical([1, 2, 3, 1, 2, 3])
>>> s1
[1, 2, 3, 1, 2, 3]
Categories (3, int64): [1, 2, 3]

>>> type(s1)
pandas.core.arrays.categorical.Categorical

>>> s1.dtype
CategoricalDtype(categories=[1, 2, 3], ordered=False)

>>> s2 = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
>>> s2
['a', 'b', 'c', 'a', 'b', 'c']
Categories (3, object): ['a', 'b', 'c']

 

  • ordered=True 를 입력하면 범주 순서에 따라 정렬되며, 최솟값과 최댓값을 가질 수 있다.
>>> s3 = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'], ordered=True, categories=['c', 'b', 'a'])
>>> s3
['a', 'b', 'c', 'a', 'b', 'c']
Categories (3, object): ['c' < 'b' < 'a']

>>> s3.min(), s3.max()
('c', 'a')

 

  • 범주를 가지는 시리즈나 데이터프레임의 열에서 범주형 데이터를 생성할 수 있는 몇 가지 방법이 있다.
① 시리즈를 구성할 때 dtype='category' 를 명시해 범주형 데이터를 생성하는 방법
ser = pd.Series(['a', 'b', 'c', 'a'], dtype='category')
ser
더보기
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): ['a', 'b', 'c']

 

② 시리즈나 데이터프레임의 열을 category dtype으로 변환하는 방법
df = pd.DataFrame({'A' : ['a', 'b', 'c', 'a']})
df['B'] = df['A'].astype('category')
df

 

df.dtypes
더보기
A      object
B    category
dtype: object

 

③ 데이터프레임 생성자에 dtype='category'를 명시하는 방법
  • 데이터프레임의 모든 행은 객체가 생성되는 도중 혹은 생성 후에 범주형으로 한꺼번에 변환할 수 있다.
    • 따라서 데이터프레임 생성시에 dtype='category'를 명시함으로써 데이터프레임 생성 중 범주형으로 변환할 수 있다.
df = pd.DataFrame({'A' : list('abca'), 'B' : list('bccd')}, dtype='category')
df.dtypes
더보기
A    category
B    category
dtype: object

 

  • 각 열에 존재하는 범주는 다를 수 있으며, 변환은 열 단위로 이루어진다.
df['A']
더보기
0    a
1    b
2    c
3    a
Name: A, dtype: category
Categories (3, object): ['a', 'b', 'c']

 

df['B']
더보기
0    b
1    c
2    c
3    d
Name: B, dtype: category
Categories (3, object): ['b', 'c', 'd']

 

DataFrame.astype()을 사용하는 방법
  • DataFame.astype()을 사용하면 데이터프레임의 모든 열을 한꺼번에 범주형으로 변환할 수 있다.
df = pd.DataFrame({'A' : list('abca'), 'B' : list('bccd')})
df_cat = df.astype('category')
df_cat.dtypes
더보기
A    category
B    category
dtype: object

 

pandas.MultiIndex 클래스

  • 멀티레벨 인덱싱(Multilevel Indexing) 또는 계층적 인덱싱(Hierarchical Indexing)은 특히 고차원 데이터를 분석하고 연산할 때 사용한다.
  • 또한 1차원 시리즈나 2차원 데이터프레임 같은 저차원 데이터 구조에 고차원 데이터를 저장하거나 연산할 수 있게 한다.
  • MultIndex 객체
    • 판다스 객체에서 축 라벨을 저장하는 표준 인덱스를 계층적으로 처리하는 것과 같다.
    • 유일하게 튜플 배열을 가진다.
  • 멀티인덱스(Multiindex)를 생성하려면 헬퍼 메소드 MultiIndex.from_arrays(), MultiIndex.from_product(), MultiIndex.from_tuples() 중 하나를 사용한다.
    • 헬퍼 메소드 : 주어진 일을 실행하기 위해 클래스를 넘나들며 반복적인 작업을 수행하는 메소드
arr = [[1, 1, 2, 2,], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arr, names=('number', 'color'))
더보기
MultiIndex([(1,  'red'),
            (1, 'blue'),
            (2,  'red'),
            (2, 'blue')],
           names=['number', 'color'])

 

arr=[['ha', 'ha', 'hi', 'hi', 'ho', 'ho',], ['one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arr))
tuples
더보기
[('ha', 'one'),
 ('ha', 'two'),
 ('hi', 'one'),
 ('hi', 'two'),
 ('ho', 'one'),
 ('ho', 'two')]

 

ind = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
ind
더보기
MultiIndex([('ha', 'one'),
            ('ha', 'two'),
            ('hi', 'one'),
            ('hi', 'two'),
            ('ho', 'one'),
            ('ho', 'two')],
           names=['first', 'second'])

 

ser = pd.Series(np.random.randn(6), index=ind)
ser
더보기
first  second
ha     one      -0.510980
       two      -1.401836
hi     one      -1.125459
       two      -1.031627
ho     one      -1.288188
       two      -1.198736
dtype: float64

 

  • 시리즈나 데이터프레임에 배열의 리스트를 직접 전달하면 멀티인덱스를 자동 생성할 수 있다.
arr = [np.array(['ha', 'ha', 'hi', 'hi', 'ho', 'ho']),
      np.array(['one', 'two', 'one', 'two', 'one', 'two'])]
ser = pd.Series(np.random.randn(6), index=arr)
ser
더보기
ha  one   -0.867112
    two    1.493873
hi  one    1.026865
    two   -0.146608
ho  one   -0.934579
    two    2.373558
dtype: float64

 

df = pd.DataFrame(np.random.randn(6, 4), index=arr)
df

 

  • 데이터프레임 df의 인덱스를 다음과 같이 구한다.
df.index
더보기
MultiIndex([('ha', 'one'),
            ('ha', 'two'),
            ('hi', 'one'),
            ('hi', 'two'),
            ('ho', 'one'),
            ('ho', 'two')],
           )

 

  • 판다스 객체의 행이나 열 축에 ind를 인수로 적용한다.
df = pd.DataFrame(np.random.randn(3, 6), index=['A', 'B', 'C'], columns=ind)
df

 

pd.DataFrame(np.random.randn(3, 4), index=ind[:3], columns=ind[:4])

 

  • 튜플을 축의 행 라벨로 사용할 수도 있다.
pd.Series(np.random.randn(6), index=tuples)
더보기
(ha, one)   -0.301471
(ha, two)    0.048705
(hi, one)    0.433145
(hi, two)    1.006454
(ho, one)   -0.401613
(ho, two)    0.595812
dtype: float64
728x90
그리드형(광고전용)

'In-depth Study > Pandas' 카테고리의 다른 글

[Pandas] 수학 계산  (0) 2022.05.31
[Pandas] 데이터의 그룹 연산  (0) 2022.05.30
[Pandas] 데이터 가공  (0) 2022.05.29
[Pandas] 데이터 타입과 입출력  (0) 2022.05.27
[Pandas] 데이터 처리  (0) 2022.05.27
[Pandas] 판다스의 주요 기능  (0) 2022.05.25
[Pandas] 판다스(Pandas) 개요  (0) 2022.05.24
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️


📖 Contents 📖