본문 바로가기
Python/Pandas

Series의 상세특징 - pandas(3)

by 콩돌 2019. 10. 7.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 Series의 상세특징


본 포스팅에서는 Series의 특징에 대해 좀더 자세히 알아보려 한다. 

   Series는 ndarray와 유사한 특성(ndarray-like)

   Series는 딕셔너리와 유사한 특성

   벡터화된 연산과 Series에서의 레이블 정렬

   name 어트리뷰트의 존재


Series와 관련된 내용을 다루는 포스팅은 다음과 같으므로 필요하면 참고하자.



 Series의 ndarray와 유사한 특성(ndarray-like)

Series는 ndarray와 상당히 유사하게 작동하며, 대부분의 Numpy 함수의 입력변수로 유효하게 적용할 수 있다.

또한, Series는 대부분의 ndarray에 지원되는 Numpy 메서드가 포함되어 있다.

  ○ ndarray에는 지원하지 않는 메서드까지도 포함되어 있다.

기본 파이썬과 Numpy에 지원하는 슬라이싱도 지원한다. 


ndarray와 유사한 특성을 보여주는 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# numpy객체로부터 Series의 생성 

In[4]: Series_ex = pd.Series(np.random.rand(4), index=['a', 'b', 'c', 'd'])

In[5]: Series_ex 

Out[5]: 

a    0.229970

b    0.970314

c    0.337064

d    0.489162

dtype: float64


# numpy 객체와 유사한 특성

In[6]: Series_ex[0]  # [ ]를 이용한 인덱싱

Out[6]: 0.2299702444903402


In[7]: Series_ex[Series_ex > Series_ex.median()] # 불린 인덱싱

Out[7]: 

b    0.970314

d    0.489162

dtype: float64


In[8]: Series_ex[[3,1,2]] # 리스트를 이용한 인덱싱

Out[8]: 

d    0.489162

b    0.970314

c    0.337064

dtype: float64


In[9]: np.sqrt(Series_ex)  # Numpy 함수의 적용

Out[9]: 

a    0.479552

b    0.985045

c    0.580573

d    0.699401

dtype: float64


Numpy 배열과 같이 pandas의 Series는 dtype을 가지며, Numpy의 dtype을 주로 사용한다. 


Numpy의 dtype을 사용하는 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# dtype의 확인

In[10]: Series_ex.dtype

Out[10]: dtype('float64')



하지만, pandas는 Numpy의 자료형 시스템을 확장시킬 수 있다.

  ○ 이는 사용자 코스튬 데이터 타입인 ExtensionDtype을 활용하면 된다.

  ○ pandas에서 대표적인 예로 Categorical data와 Nullable interger data type등 이 있다.


자세한 사항은 dtype()을 참고하자.



 Series의 딕셔너리와 유사한 특성(dict-like)

Series는 고정된 크기를 가지는 딕셔너리와 유사하다.

  ○ 사용자는 인덱스 레이블을 사용하여 값을 세팅하고 불러올 수 있다.


딕셔너리와 유사한 특성을 보여주는 예)

# pandas와 Numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# 변수는 위에서 사용하였던 Series_ex를 사용하였음


# 딕셔너리와 유사한 특성을 보여주는 예

In[12]: Series_ex['a']  # 레이블을 통한 접근 

Out[12]: 0.2299702444903402


In[13]: Series_ex['e'] = 50  # 레이블을 통한 배정

In[14]: Series_ex

Out[14]: 

a     0.229970

b     0.970314

c     0.337064

d     0.489162

e    50.000000

dtype: float64


In[15]: 'd' in Series_ex  # in의 적용1

Out[15]: True


In[16]: 'f' in Series_ex  # in의 적용2

Out[16]: False


# 입력된 레이블이 존재하지 않으면 예외를 발생시킴

In[17]: Series_ex['kk']

KeyError: 'kk'


get() 메서드를 통해 누락된 레이블을 None이나 혹은 명시된 기본값으로 반환할 수 있다.

 

get() 메서드의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# 변수는 위에서 사용하였던 Series_ex를 사용하였음


# get() 메서드의 사용

In[18]: Series_ex.get('kk')


In[19]: Series_ex.get('kk', default='Missing data')

Out[19]: 'Missing data'


자세한 사항은 section on attribute access를 참고하자.

 


 벡터화된 연산과 Series에서의 레이블 정렬

Numpy 배열과 관련된 작업을 처리할 때, 일반적으로 for문 등을 사용하여 값을 하나씩 반복하여 처리하지 않는다.

  ○ 벡터화를 활용하여 배열 안의 여러 데이터를 한번에 처리한다.

pandas에서 Series를 사용하여 작업하는 것도 Numpy와 마찬가지로 사실상 벡터화하여 처리한다.


Series 벡터화를 보여주는 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# 변수는 위에서 사용하였던 Series_ex를 사용하였음


# 벡터화를 보여주는 예

In[20]: Series_ex - Series_ex

Out[20]: 

a    0.0

b    0.0

c    0.0

d    0.0

e    0.0

dtype: float64


In[21]: Series_ex * 5

Out[21]: 

a      1.149851

b      4.851569

c      1.685322

d      2.445810

e    250.000000

dtype: float64



ndarray와 Series의 중요한 차이점은 Series간에 연산은 자동적으로 레이블을 기반하여 데이터를 정렬한다.

그러므로 사용자는 Series가 같은 레이블을 가지고 있는지 고려할 필요없이 계산식을 작성해도 무방하다.

 

일부 중복되는 레이블을 가지는 Series 간의 연산 수행의 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# 변수는 위에서 사용하였던 Series_ex를 사용하였음


# 일부 중복되는 레이블을 가지는 Series 간의 연산 수행

In[24]: Series_ex[0:3] + Series_ex[2:5]

Out[24]: 

a         NaN

b         NaN

c    0.674129

d         NaN

e         NaN

dtype: float64


정렬되지 않은 Series간의 연산의 결과는 각 Series의 인덱스들 포함하는 합집합을 가진다.

특정 레이블이 어느 한 Series에서 있는 레이블이 다른 Series에는 없다면, NaN으로 누락데이터를 표시한다. 


별도의 데이터 정렬없이 코드작성이 가능하다는 점은 데이터 분석과 연구에서 엄청난 자유도와 유연성을 보장할 수 있다.

pandas 데이터 구조의 통합데이터정렬기능은 pandas를 다른 툴과의 차별성을 두드러지게 한다.

 

참고사항 

  일반적으로 pandas는 기본적으로 서로 다른 인덱스를 가지는 객체들 간의 인덱스의 합집합으로 만들어 출력하도록 설정하였다. 

    - 이는 정보의 소실을 피하기 위함이다. 

    - 데이터가 소실됬음에도 인덱스 레이블을 남기는 것은 계산의 한 부분으로써 중요한 정보를 남긴다.

    - 사용자가 누락된 데이터들을 제거하고 싶다면 dropna 함수를 사용하면 된다.



 name 어트리뷰트의 존재


Series는 name 어트리뷰트를 포함하고 있다.

 

Series의 name 설정 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# Series의 name 설정

In[25]: Series_name= pd.Series([1, 2, 3], name='Thisname')

In[26]: Series_name.name

Out[26]: 'Thisname'


In[27]: Series_name.rename('Othername')

Out[27]: 

0    1

1    2

2    3

Name: Othername, dtype: int64


Series에서 name은 보통 자동적으로 배정된다.

특히 DataFrame에서 1차원 슬라이스를 수행하는 것을 예로 들 수 있다.

 

사용자는 Series를 pandas.Series.rename() 메서드를 사용하여 이름을 변경할 수 있다.

Series_name와 Series_name2가 다른 객체를 참조한다.


Series의 name 재설정 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

...

# Series의 name의 재설정

In[29]: Series_name2= Series_name.rename('Othername')

In[30]: Series_name2.name

Out[30]: 'Othername'



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html

  https://pandas.pydata.org/pandas-docs/version/0.25/reference/api/pandas.Series.html

 

 

 

 




반응형

댓글