카테고리 없음

PANDAS 데이터 구조 소개

월미 2021. 10. 25. 17:12

pandas의 기본 데이터 구조에 대한 빠르고 포괄적이지 않은 개요부터 시작하겠습니다. 

데이터 유형, 인덱싱 및 축 레이블 지정/정렬에 대한 기본 동작은 모든 개체에 적용됩니다. 시작하려면 NumPy를 가져오고 pandas를 네임스페이스에 로드합니다.

 

In [1]: import numpy as np

In [2]: import pandas as pd

 

다음은 명심해야 할 기본 원칙입니다. 

데이터 정렬은 본질적 입니다. 레이블과 데이터 간의 연결은 사용자가 명시적으로 수행하지 않는 한 끊어지지 않습니다.

 

시리즈 

Series모든 데이터 유형(정수, 문자열, 부동 소수점 숫자, Python 객체 등)을 보유할 수 있는 1차원 레이블 배열입니다. 축 레이블을 집합적으로 인덱스 라고 합니다 . 시리즈를 만드는 기본 방법은 다음을 호출하는 것입니다.

 

>>> s = pd.Series(data, index=index)

 

여기에서 data여러 가지가 있을 수 있습니다.

  • 파이썬 딕셔너리
  • ndarray
  • 스칼라 값(예: 5)

전달된 인덱스 는 축 레이블 목록입니다. 따라서 이것은 데이터가 무엇인지에 따라 몇 가지 경우로 나뉩니다  . 

인덱스가 전달되지 않으면 값이 있는 인덱스가 생성됩니다 .

[0, ..., len(data) - 1]

 

In [3]: s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])

In [4]: s

Out[4]:

a 0.469112

b -0.282863

c -1.509059

d -1.135632

e 1.212112

dtype: float64

 

In [5]: s.index

Out[5]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

 

In [6]: pd.Series(np.random.randn(5))

Out[6]:

0 -0.173215

1 0.119209

2 -1.044236

3 -0.861849

4 -2.104569

dtype: float64

 

메모

pandas는 고유하지 않은 인덱스 값을 지원합니다. 중복 인덱스 값을 지원하지 않는 작업을 시도하면 그 때 예외가 발생합니다. 

 

 

딕셔너리에서

Series는 dicts에서 인스턴스화할 수 있습니다.

 

In [7]: d = {"b": 1, "a": 0, "c": 2}

In [8]: pd.Series(d)

Out[8]:

b 1

a 0

c 2

dtype: int64

 

메모

데이터가 사전이고 인덱스가 전달되지 않으면 SeriesPython 버전 >= 3.6 및 pandas 버전 >= 0.23을 사용하는 경우 인덱스가 사전의 삽입 순서에 따라 정렬됩니다.

Python < 3.6 또는 pandas < 0.23을 사용하고 인덱스가 전달되지 않은 경우 Series인덱스는 사전순으로 정렬된 사전 키 목록이 됩니다.

 

 

위의 예에서 Python 버전이 3.6 미만이거나 pandas 버전이 0.23 미만인 Series경우 dict 키의 어휘 순서에 따라 정렬됩니다.['a', 'b', 'c']['b', 'a', 'c']

인덱스가 전달되면 인덱스의 레이블에 해당하는 데이터의 값이 제거됩니다.

 

In [9]: d = {"a": 0.0, "b": 1.0, "c": 2.0}

In [10]: pd.Series(d)

Out[10]:

a 0.0

b 1.0

c 2.0

dtype: float64

In [11]: pd.Series(d, index=["b", "c", "d", "a"])

Out[11]:

b 1.0

c 2.0

d NaN

a 0.0

dtype: float64

 

메모

NaN(숫자가 아님)은 팬더에서 사용되는 표준 누락 데이터 마커입니다.

 

스칼라 값에서

data스칼라 값의 경우, 인덱스를 제공해야합니다. 값은 index 의 길이와 일치하도록 반복됩니다 .

 

In [12]: pd.Series(5.0, index=["a", "b", "c", "d", "e"])

Out[12]:

a 5.0

b 5.0

c 5.0

d 5.0

e 5.0

dtype: float64

시리즈는 ndarray와 유사합니다 

Series와 매우 유사하게 작동 ndarray하며 대부분의 NumPy 함수에 대한 유효한 인수입니다. 그러나 슬라이싱과 같은 작업은 인덱스도 슬라이싱합니다.

 

In [13]: s[0]

Out[13]: 0.4691122999071863

 

In [14]: s[:3]

Out[14]:

a 0.469112

b -0.282863

c -1.509059

dtype: float64

 

In [15]: s[s > s.median()]

Out[15]:

a 0.469112

e 1.212112

dtype: float64

 

In [16]: s[[4, 3, 1]]

Out[16]:

e 1.212112

d -1.135632

b -0.282863

dtype: float64

 

In [17]: np.exp(s)

Out[17]:

a 1.598575

b 0.753623

c 0.221118

d 0.321219

e 3.360575

dtype: float64

 

 

NumPy 배열과 마찬가지로 pandas 시리즈에는 dtype를 사용.

In [18]: s.dtype

Out[18]: dtype('float64')

 

실제 배열이 필요하면 Series사용하십시오 Series.array.

In [19]: s.array

Out[19]:

[ 0.4691122999071863, -0.2828633443286633, -1.5090585031735124, -1.1356323710171934, 1.2121120250208506] Length: 5, dtype: float64

 

배열에 액세스하는 것은 인덱스 없이 일부 작업을 수행해야 할 때 유용할 수 있습니다( 예: 자동 정렬 비활성화 ).

 

Series는 ndarray와 유사하지만 실제 ndarray 가 필요한 경우 Series.to_numpy()를 사용합니다

In [20]: s.to_numpy()

Out[20]: array([ 0.4691, -0.2829, -1.5091, -1.1356, 1.2121])

 

Series는 dict와 유사합니다 

Series는 인덱스 레이블로 값을 가져오고 설정할 수 있다는 점에서 고정 크기 사전과 같습니다.

 

In [21]: s["a"]

Out[21]: 0.4691122999071863

 

In [22]: s["e"] = 12.0

In [23]: s

Out[23]:

a 0.469112

b -0.282863

c -1.509059

d -1.135632

e 12.000000

dtype: float64

 

In [24]: "e" in s

Out[24]: True

 

In [25]: "f" in s

Out[25]: False

레이블이 포함되어 있지 않으면 예외가 발생합니다.

 

>>> s["f"] KeyError: 'f'

 get메서드를 사용하면 누락된 레이블이 None 또는 지정된 기본값을 반환합니다.

 

In [26]: s.get("f")

In [27]: s.get("f", np.nan)

Out[27]: nan

 

시리즈를 사용한 벡터화된 작업 및 레이블 정렬 

원시 NumPy 배열로 작업할 때 값별로 루핑하는 것은 일반적으로 필요하지 않습니다. 

pandas에서 Series로 작업할 때도 마찬가지입니다. 

시리즈는 ndarray를 기대하는 대부분의 NumPy 메소드에 전달할 수도 있습니다.

In [28]: s + s

Out[28]:

a 0.938225

b -0.565727

c -3.018117

d -2.271265

e 24.000000

dtype: float64

 

In [29]: s * 2

Out[29]:

a 0.938225

b -0.565727

c -3.018117

d -2.271265

e 24.000000

dtype: float64

 

In [30]: np.exp(s)

Out[30]:

a 1.598575

b 0.753623

c 0.221118

d 0.321219

e 162754.791419

dtype: float64

 

Series와 ndarray의 주요 차이점은 Series 간의 작업이 레이블을 기반으로 데이터를 자동으로 정렬한다는 것입니다. 따라서 관련된 시리즈에 동일한 레이블이 있는지 여부를 고려하지 않고 계산을 작성할 수 있습니다.

 

In [31]: s[1:] + s[:-1]

Out[31]:

a NaN

b -0.565727

c -3.018117

d -2.271265

e NaN

dtype: float64

정렬되지 않은 Series 간의 작업 결과에는 관련된 인덱스  합집합 이 있습니다 . 

한 시리즈 또는 다른 시리즈에서 레이블을 찾을 수 없으면 결과가 누락된 것으로 표시됩니다 . 

명시적인 데이터 정렬 없이 코드를 작성할 수 있다는 것은 대화형 데이터 분석 및 연구에서 엄청난 자유와 유연성을 부여합니다. 

pandas 데이터 구조의 통합 데이터 정렬 기능은 레이블이 지정된 데이터 작업을 위한 대부분의 관련 도구와 pandas를 구분합니다.

NAME 속성 

시리즈에는 다음과 같은 name속성 도 있을 수 있습니다 .

In [32]: s = pd.Series(np.random.randn(5), name="something")

In [33]: s

Out[33]:

0 -0.494929

1 1.071804

2 0.721555

3 -0.706771

4 -1.039575

Name: something, dtype: float64

 

In [34]: s.name

Out[34]: 'something'

 

Series name는 많은 경우, 특히 아래에서 볼 수 있는 것처럼 DataFrame의 1D 조각을 가져올 때 자동으로 할당됩니다.

pandas.Series.rename()방법을 사용 하여 시리즈의 이름을 바꿀 수 있습니다 .

In [35]: s2 = s.rename("different")

In [36]: s2.name

Out[36]: 'different'