본문 바로가기
Python/Pandas

where 및 mask 메서드 옵션, 설명, 사용 예-pandas(17)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준


 where 및 mask 메서드 옵션, 설명, 사용 예


본 포스팅에서는 where메서드에 대한 설명과 이를 응용한 인덱싱에 대해 설명한다.



 where 메서드 


where 메서드는 특정 조건에 맞는 데이터들을 선택하여 출력하는데 사용될 수 있다.

 ○ 이 메서드는 조건식을 입력받는데, 조건식에 True에 해당하는 데이터들을 출력한다.

 ○ 이 메서드는 적용되는 Series나 DataFrame의 형상과 일치하는 데이터를 출력한다.


where() 메서드 사용형식)

Series.where(cond, other=None, inplace=False, axis=None)

DataFrame.where(cond, other=None, inplace=False, axis=None)


cond는 조건식을 입력받는다. 
  ○ 메서드가 사용되는 배열과 형상이 동일한 불린배열(boolean array)을 입력해도 무방하다.
other는 조건식이 만족되지 않을 경우 채울 값을 입력받는다.
  ○ 기본값은 None이고 이때 NaN을 출력한다.
inplace가 True일 경우 where메서드 적용 시 출력값으로 원본 배열을 교체한다.
axis에 대한 내용은 밑에 예제를 참고하자.


참고사항(대괄호[조건식] 대신 where 메서드간의 다른 점)

  Series에서 적용 시

    ○ 대괄호[조건식]은 조건식이 True가 되는 결과만 출력한다.

    ○ where 메서드는 조건식이 False이 되면 other에 입력된 값을 출력하거나 NaN을 출력하여 기존 배열과 형상을 맞춘다.

    ○ 즉, 기존 배열과 형상을 똑같이 유지할 필요가 있을 경우에는 where를 아니면 대괄호[조건식]을 사용하면 된다.

  DataFrame에서 적용 시

    ○ 조건식의 결과가 False일 때 대괄호[조건식]은 NaN값을 넣고 DataFrame을 출력한다.

    ○ 조건식의 결과가 False일 때 where 메서드는 기본값으로 NaN값 넣고 DataFrame을 출력하지만, other변수에 값을 입력함으로써 사용자가 원하는 값이 넣어진 DataFrame을 출력할 수 있다.

 

참고사항

  numpy에서의 where 함수와 pandas에서의 where 메서드는 약간 사용법이 다르니 사용에 주의하자.

 


 where 메서드 사용 예제

다음 예제는 Series에서의 where 메서드에 대한 다양한 적용 예이다.


Series에서의 where 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[4]: ex_s=pd.Series(np.arange(6),index=['r'+str(x) for x in range(6)], dtype="int32")


# 대괄호[조건식]

In[5]: ex_s[ex_s>3]

Out[5]: 

r4    4

r5    5

dtype: int32


# where 메서드

In[6]: ex_s.where(ex_s>3)

Out[6]: 

r0    NaN

r1    NaN

r2    NaN

r3    NaN

r4    4.0

r5    5.0

dtype: float64


# where 메서드(other 입력변수 사용)

In[7]: ex_s.where(ex_s>3, other=0)

Out[7]: 

r0    0

r1    0

r2    0

r3    0

r4    4

r5    5

dtype: int32


In[8]: ex_s  # 원본 배열은 변하지 않음을 확인

Out[8]: 

r0    0

r1    1

r2    2

r3    3

r4    4

r5    5

dtype: int32


# where 메서드(inplace 입력변수 사용, 원본배열의 변경)

In[9]: ex_s.where(ex_s>3, other=0, inplace=True)

In[10]: ex_s

Out[10]: 

r0    0

r1    0

r2    0

r3    0

r4    4

r5    5

dtype: int32


다음 예제는 DataFrame에서의 where 적용 예이다. 

대부분의 입력변수에 대한 내용은 Series 예제에서 다루었기 때문에 간단하게만 예제를 다도록 한다.


DataFrame에서의 where 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[11]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])


# 대괄호[조건식]

In[12]: ex_df[ex_df>5]

Out[12]: 

     c0   c1   c2

r0  NaN  NaN  NaN

r1  NaN  NaN  NaN

r2  6.0  7.0  8.0


# where 메서드

In[13]: ex_df.where(ex_df>5, other=-1)

Out[13]: 

    c0  c1  c2

r0  -1  -1  -1

r1  -1  -1  -1

r2   6   7   8


조건식을 만족하지 못할 경우, 각 행 혹은 각 열마다 다른 값을 채워넣기 위해서 axis 변수를 이용하는 것이 가능하다.

  ○ axis=0인 경우: 조건식 불만족시, 각 행별로 설정된 값이 적용된다.

    other에 입력되는 배열의 요소 개수는 행의 개수와 동일해야한다.

  ○ axis=1인 경우: 조건식 불만족시, 각 열별로 설정된 값이 적용된다. 

    other에 입력되는 배열의 요소 개수는 열의 개수와 동일해야한다.


axis 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[14]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])


# axis=0 인 경우 

In[15]: ex_df.where(ex_df<3, ex_df['c0'], axis=0)

Out[15]: 

    c0  c1  c2

r0   0   1   2

r1   3   3   3

r2   6   6   6


# axis=1 인 경우 

In[16]: ex_df.where(ex_df<3, ex_df.loc['r0'], axis=1)

Out[16]: 

    c0  c1  c2

r0   0   1   2

r1   0   1   2

r2   0   1   2



 mask 메서드 


mask 메서드는 특정 조건에 맞지 않는 데이터들을 선택하여 출력하는데 사용될 수 있다. 

 ○ 이 메서드는 조건식을 입력받는데, 조건식에 False에 해당하는 데이터들을 출력한다.

 ○ 이 메서드는 적용되는 Series나 DataFrame의 형상과 일치하는 데이터를 출력한다.

 ○ where 메서드와는 반대이다.


mask() 메서드 사용형식)

Series.mask(cond, other=None, inplace=False, axis=None)

DataFrame.mask(cond, other=None, inplace=False, axis=None)


cond는 조건식을 입력받는다.
  ○ 메서드가 사용되는 배열과 형상이 동일한 불린배열(boolean array)을 입력해도 무방하다.
other는 조건식이 만족되지 않을 경우 채울 값을 입력받는다.
  ○ 기본값은 None이고 이때 NaN을 출력한다.
inplace가 True일 경우 mask메서드 적용 시 출력값으로 원본 배열을 교체한다.



참고사항(mask와 where 메서드간의 공통점과 차이점)

  차이점: Where은 조건식이 True일 때 데이터를 살려두나, mask는 이와 반대로 False일 때 데이터를 살려둔다.

  공통점: 그 외에 where메서드에서 적용된 입력변수들은 동일하게 적용 가능하다.

 


 mask 메서드 사용 예제

다음은 mask 메서드에 대한 사용 예제이다.

mask 메서드의 입력변수에 대한 내용은 False일때 데이터를 선택한다는 것을 제외하고는 where 메서드와 동일하고 Series에서의 메서드 적용 방식도 동일하므로 해당 내용에 대한 예제는 생략하도록 한다.


mask 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[17]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])


# where 메서드

In[18]: ex_df.where(ex_df>5, other=-1)

Out[18]: 

    c0  c1  c2

r0  -1  -1  -1

r1  -1  -1  -1

r2   6   7   8


# mask 메서드

In[19]: ex_df.mask(ex_df>5, other=-1)

Out[19]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2  -1  -1  -1



 각 메서드 옵션 상세설명



 DataFrame.where(self, cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)

cond에 입력된 값이 True일 경우 데이터를 그대로 두고, False일 경우 값을 대체하여 출력한다.


cond: boolean Series/DataFrame, array-like, or callable 

cond가 True일 경우 기존값을 유지시킨다.

cond가 False일 경우, 기존값을 other값으로 대체한다. 

cond가 callable일 경우 Series/DataFrame에서 계산되며, 불린 Series/DataFrame 혹은 배열을 반환한다.

callable은 반드시 입력 Series/DataFrame을 바꿔서는 안된다. (pandas는 이를 체크하지는 않는다.)


other: scalar, Series/DataFrame, or callable

cond가 False일 경우 해당 값을 other에 입력된 값으로 대체한다.

만약 callable이 입력될 경우 Series/DataFrame에서 계산이 되며, 반드시 스칼라나 Series/DataFrame값을 반환하여야 한다.

callable은 반드시 입력 Series/DataFrame을 변경해서는 안된다. (pandas는 이를 체크하지는 않는다.)


inplace: bool

해당 위치에서 연산을 수행한 후 대체할지 여부를 결정짓는다.

기본값은 False이다.


axis: int

메서드가 적용될 축을 선택한다.(각 축에 따라 다른 값을 채워 넣을 경우)

기본값은 None이다.


level : int

메서드가 적용될 레벨을 선택한다. (멀티인덱스 인 경우)

기본값은 None이다.


errors: str, {'raise', 'ignore'}

에러를 발생시킬 것인지, 발생시키지 않고 원본배열을 반환할 것인지 결정해준다.

기본값은 'raise'이다.

  - 'raise': 예외를 발생시키는 것을 허가한다.

  - 'ignore': 예외를 무시한다. 에러 발생시 원본 객체를 반환한다.


try_cast: bool

만약 가능하다면, 입력된 타입으로 결과를 캐스팅 하는 것을 시도한다.

기본값은 False이다.



 DataFrame.mask(self, cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)

cond에 입력된 값이 False일 경우 데이터를 그대로 두고, True일 경우 값을 대체하여 출력한다.


cond: boolean Series/DataFrame, array-like, or callable 

cond가 False일 경우 기존값을 유지시킨다.

cond가 True일 경우, 기존값을 other값으로 대체한다. 

cond가 callable일 경우 Series/DataFrame에서 계산되며, 불린 Series/DataFrame 혹은 배열을 반환한다.

callable은 반드시 입력 Series/DataFrame을 바꿔서는 안된다. (pandas는 이를 체크하지는 않는다.)


other: scalar, Series/DataFrame, or callable

cond가 True일 경우 해당 값을 other에 입력된 값으로 대체한다.

만약 callable이 입력될 경우 Series/DataFrame에서 계산이 되며, 반드시 스칼라나 Series/DataFrame값을 반환하여야 한다.

callable은 반드시 입력 Series/DataFrame을 변경해서는 안된다. (pandas는 이를 체크하지는 않는다.)


inplace: bool

해당 위치에서 연산을 수행할 지 여부를 결정짓는다.

기본값은 False이다.


axis: int

메서드가 적용될 축을 선택한다.(각 축에 따라 다른 값을 채워 넣을 경우)

기본값은 None이다.


level : int

메서드가 적용될 레벨을 선택한다. (멀티인덱스인 경우)

기본값은 None이다.


errors: str, {'raise', 'ignore'}
에러를 발생시킬 것인지, 발생시키지 않고 원본배열을 반환할 것인지 결정해준다.

기본값은 'raise'이다.

  - 'raise': 예외를 발생시키는 것을 허가한다.

  - 'ignore': 예외를 무시한다. 에러 발생시 원본 객체를 반환한다.


try_cast: bool

만약 가능하다면, 입력된 타입으로 결과를 캐스팅 하는 것을 시도한다.

기본값은 False이다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mask.html

 

 

 

 



반응형

댓글