본문 바로가기
Python/Pandas

두 객체의 데이터 정렬을 위한 align() 메서드 - pandas(29)

by 콩돌 2020. 9. 11.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준


 두 객체의 데이터 정렬을 위한 align() 메서드


본 포스팅에서는 align() 메서드의 사용법에 대해 다룬다.


 align() 메서드


align() 메서드는 두 객체를 동시에 정렬하는 가장 빠른 방법이다.

  ○ 이 메서드는 두 객체를 정렬하여 두 객체로 구성된 튜플로 출력을 한다. 


메서드 사용 형식)

result=object1.align(object2, join=None, axis=None, fill_value=np.NaN, method=None, limit=None)


각 입력 객체별 설명은 다음과 같다.

  ○ object1: 데이터를 정렬하기 위해 메서드가 적용되는 객체1(DataFrame, Series)이다.

  ○ object2: 데이터를 정렬하기 위해 메서드에 입력되는 객체2(DataFrame, Series)이다.

  ○ axis: 객체1이 DataFrame인 경우 정렬을 수행할 축을 입력받는다. 기본값으로는 두 축 모두 정렬을 수행한다.

    ▷ None: 기본값이며 두 축 모두 정렬을 수행시킨다.

    ▷ 'index' / 0 : 행에 대해서만 정렬을 수행시킨다.

    ▷ 'columns' / 1 : 열에 대해서만 정렬을 수행시킨다.

  ○ method: 정렬을 수행 후 누락값이 발생할 경우에 해당 값을 채우는 방식을 입력받는다.

  ○ fill_value: 정렬을 수행한 후 누락값이 발생할 경우에 해당 값을 채울 값을 입력받는다.

  ○ limit: 누락값이 연속적으로 여러 개 존재할 때 method방식에 따라 누락 값을 채우는 개수를 제한한다.

    ※ method, fill_value, limit 옵션의 상세 내용은 reindex() 메서드(링크)와 동일하다.


이 메서드의 핵심은 join 입력변수이므로 이는 따로 설명한다.

join입력변수에 다음과 같은 입력에 따라 출력되는 값을 조절할 수 있다.

  ○ join='outer': 두 객체 인덱스를 합하여 출력이 된다. (기본값)

    ▷ 즉, 인덱스가 합집합으로 출력된다.

    ▷ 한쪽에만 존재하는 인덱스라면 다른쪽 인덱스에 해당하는 값은 NaN(누락값)이 입력되어 출력된다. 

  ○ join='left': 호출하는 객체(object1)의 인덱스를 사용한다.

  ○ join='right': 입력되는 객체(object2)의 인덱스를 사용한다.

  ○ join='inner': 두 객체 둘다 있는 인덱스를 교차시킨다.

    ▷ 즉, 인덱스가 교집합으로 출력된다. 

 

 align() 메서드 사용 예제

본 포스팅에서는 다음과 같이 pandas와 numpy를 import시킨 후 예제를 수행하였다.

  ○ 본 포스팅에서는 numpy는 딱히 쓰지는 않지만 습관적으로 그랬다.


모듈의 임폴트)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


Series에 대한 align()메서드 사용예제

이는 둘 다 재인덱스된 Series를 사용하여 튜플을 반환한다.


Series에 대한 align() 메서드 사용 예제)

# 예제 Series의 정의

In[4]: sample_s = pd.Series([1.1, 2.2, 3.3, 4.4, 5.5], index=['a', 'b', 'c', 'd', 'e'])

In[5]: sample_s1 = sample_s[:4]

In[6]: sample_s2 = sample_s[1:]


# 기본적인 align() 메서드 사용

In[7]: sample_s1.align(sample_s2)

Out[7]: 

(a    1.1

 b    2.2

 c    3.3

 d    4.4

 e    NaN

 dtype: float64,

 a    NaN

 b    2.2

 c    3.3

 d    4.4

 e    5.5

 dtype: float64)


# join 입력변수 사용('inner')

In[8]: sample_s1.align(sample_s2, join='inner')

Out[8]: 

(b    2.2

 c    3.3

 d    4.4

 dtype: float64,

 b    2.2

 c    3.3

 d    4.4

 dtype: float64)


# join 입력변수 사용('left')

In[9]: sample_s1.align(sample_s2, join='left')

Out[9]: 

(a    1.1

 b    2.2

 c    3.3

 d    4.4

 dtype: float64,

 a    NaN

 b    2.2

 c    3.3

 d    4.4

 dtype: float64)

 

DataFrame에 대한 align()메서드 사용예제

DataFrame에 대해 join 입력변수는 기본값으로써 행과 열 둘 다 적용되어진다. 


DataFrame에 대한 align() 메서드 사용 예제)

예제 DataFrame의 정의

In[10]: sample_df=pd.DataFrame([[1.1, 1.2, 1.3, 1.4], [2.1, 2.2, 2.3, 2.4], [3.1, 3.2, 3.3, 3.4]], index=['a', 'b', 'c'], columns=['A','B','C','D'])

In[11]: sample_df2=pd.DataFrame([[0, 1, 2], [3, 4, 5]], index=['a', 'c'], columns=['B','C','D'])


# 기본적인 align() 메서드 사용

In[12]: sample_df.align(sample_df2)

Out[12]: 

(     A    B    C    D

 a  1.1  1.2  1.3  1.4

 b  2.1  2.2  2.3  2.4

 c  3.1  3.2  3.3  3.4,

     A    B    C    D

 a NaN  0.0  1.0  2.0

 b NaN  NaN  NaN  NaN

 c NaN  3.0  4.0  5.0)


# join 입력변수 사용('inner')

In[13]: sample_df.align(sample_df2, join='inner')

Out[13]: 

(     B    C    D

 a  1.2  1.3  1.4

 c  3.2  3.3  3.4,

    B  C  D

 a  0  1  2

 c  3  4  5)

 

사용자는 또한 axis 옵션을 사용하여 한쪽 축에만 정렬을 수행할 수 있다.. 

  ○ axis 옵션은 정렬할 축을 명시한다.

  ○ None: 기본값이며 두 축 모두 정렬을 수행시킨다.

  ○ 'index' / 0 : 행에 대해서만 정렬을 수행시킨다.

  ○ 'columns' / 1 : 열에 대해서만 정렬을 수행시킨다.


한쪽 축에만 정렬 수행 예제)

# 행방향으로만 정렬 수행 예제 axis = 0 / 'index'

In[14]: sample_df.align(sample_df2, join='inner', axis=0)

Out[14]: 

(     A    B    C    D

 a  1.1  1.2  1.3  1.4

 c  3.1  3.2  3.3  3.4,

    B  C  D

 a  0  1  2

 c  3  4  5)


# 열방향으로만 정렬 수행 예제 axis = 1 / 'columns'

In[15]: sample_df.align(sample_df2, join='inner', axis=1)

Out[15]: 

(     B    C    D

 a  1.2  1.3  1.4

 b  2.2  2.3  2.4

 c  3.2  3.3  3.4,

    B  C  D

 a  0  1  2

 c  3  4  5)

 


DataFrame과 Series에 대한 align()메서드 사용예제

사용자가 Series를 DataFrame.align() 메서드에 입력한다면, 사용자는 axis 입력변수를 사용하여 두 객체를 DataFrame 인덱스 혹은 열에 대해 정렬할 것인지 결정할 수 있다.


모듈의 임폴트)

# pandas와 numpy의 import

In[16]: sample_df.align(sample_s, axis=0)

Out[16]: 

(     A    B    C    D

 a  1.1  1.2  1.3  1.4

 b  2.1  2.2  2.3  2.4

 c  3.1  3.2  3.3  3.4

 d  NaN  NaN  NaN  NaN

 e  NaN  NaN  NaN  NaN,

 a    1.1

 b    2.2

 c    3.3

 d    4.4

 e    5.5

 dtype: float64)

 


 .align()메서드 세부사항


두 객체를 join 입력변수에 입력된 방법을 통해 각각의 축에 대해 정렬한다. 


 DataFrame.align(other, join='outer', axis=None, level=None, copy=True, fill_value=None, method=None, limit=None, fill_axis=0, broadcast_axis=None)


other: DataFrame or Series

비교 정렬을 수행할 객체를 입력받는다.


join: {‘outer’, ‘inner’, ‘left’, ‘right’}, default ‘outer’

정렬 수행 시 인덱스의 처리 방법에 대한 방법을 입력받는다.

기본값은 'outer'이며 두 인덱스의 합집합으로 결과가 출력된다. 

  ○ join='outer': 두 객체 인덱스를 합하여 출력이 된다. (기본값)

    ▷ 즉, 인덱스가 합집합으로 출력된다.

    ▷ 한쪽에만 존재하는 인덱스라면 다른쪽 인덱스에 해당하는 값은 NaN(누락값)이 입력되어 출력된다. 

  ○ join='left': 호출하는 객체(object1)의 인덱스를 사용한다.

  ○ join='right': 입력되는 객체(object2)의 인덱스를 사용한다.

  ○ join='inner': 두 객체 둘다 있는 인덱스를 교차시킨다.

    ▷ 즉, 인덱스가 교집합으로 출력된다. 


axis: allowed axis of the other object

기본값은 None이다.

정렬하기 위한 축을 설정한다. 

  ○ None : None이 입력되면 두 축 모두에 대해 정렬을 수행한다.

  ○ 'index' / 0 : 'index'나 0이 입력될 경우 행(row)에 대해 정렬을 수행한다.

  ○ 'columns' / 1 : 'columns'이나 1이 입력될 경우 열(columns)에 대해 정렬을 수행한다.


level: int or level name

기본값은 None이다.

입력된 MultiIndex level의 Index 값과 일치하는 level에 걸쳐 브로드캐스팅을 수행한다.


copy: bool

기본값은 True이다.

항상 새로운 객체를 반환한다.

만약 False가 입력되고 reindexing이 요구되지 않는다면, 그때에는 기존 객체가 반환된다.


fill_value: scalar

기본값은 np.NaN이다.

누락값에 채우고자 하는 값을 입력받는다.


method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}

기본값은 None이다.

재인덱싱되는 Series 안에서 누락값을 채우기 위한 방법을 입력받는다.

  ○ pad/ffill: 마지막 유효한 관측치를 다음 유효한 관측치로 전파한다.

  ○ backfill/ bfill: 빈 데이터를 채우기 위해, 다음 관측치를 사용한다.


limit: int

기본값은 None이다.

연속적인 누락값(NaN)을 채우는 최대 숫자를 입력받는다. 

다르게 표현하면 만약에 연속적인 누락값(NaN)들의 수가 limit에 입력된 수보다 크다면 누락값들이 부분적으로 채워진다.

만약 이 변수에 입력이 되지 않는다면 method에 입력된 방법을 통해 모든 누락값(NaN)이 채워진다. 

해당 값이 입력되면 0보다 커야한다.


fill_axis: {0 or ‘index’, 1 or ‘columns’}, default 0

기본값은 0이다.

axis, method, limit을 채운다.(??)


broadcast_axis: {0 or ‘index’, 1 or ‘columns’}

기본값은 None이다.

만약 다른 차원의 두 객체를 정렬 시킬때, 입력된 축을 따라 브로드캐스팅을 수행한다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/docs/user_guide/basics.html

  https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.align.html

 

 

 

 


반응형

댓글