본문 바로가기
Python/Pandas

isin 메서드 옵션 및 설명과 인덱싱-pandas(16)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준


 isin() 메서드를 사용한 인덱싱


본 포스팅에서는 isin() 메서드를 활용하여 인덱싱 하는 방법에 대해서 다룬다. 



 isin() 메서드


isin() 메서드는 메서드 이름에서 유추할 수 있듯이 요소가 Series나 DataFrame안에 요소가 isin() 메서드에 입력된 데이터가 있는지 판별해주는 역할을 한다.

  ○ 사용형식은 아래 사용형식 예제에서 확인할 수 있다.

  ○ 여기서, 아래 사용형식 순서와 영어 문장의 순서는 거의 동일하다고 생각하면 이해하기 편하다.

     ▷ "Data.isin(values)"가 영어 문장에서 "Data is in values"라고 생각해보자. 


isin() 메서드 사용형식)

Series.isin(values)

DataFrame.isin(values)


여기서 values는 Series나 DataFrame에서 존재여부를 확인하려는 데이터를 입력받는다.

   Series에서는 set이나 list와 유사한 자료형을 입력받을 수 있다. 

   DataFrame에서는 Series, DataFrame, 딕셔너리, 그외에 각종 이터레이블한 자료형이 입력가능하다.


좀 더 자세히 설명하자면, values에 입력된 데이터를 메서드가 적용된 Series나 DataFrame의 각 요소에 존재 여부를 파악한다. 

만약 요소가 values에 입력된 데이터들 중 일치한다면, 해당 요소 위치에 대해서는 True를 아니면 False를 출력한다.

최종적으로 이런 각 요소에 대한 판별을 통해 메서드가 적용된 자료와 동일한 형상을 가지는 불린 배열(boolean array)을 출력한다.

  ○ 즉, Series에 적용 시에는 Series인 불린배열을, DataFrame에 적용 시에는 DataFrame인 불린배열을 출력한다.


이러한 특징을 적절히 이용하여 불린인덱싱으로 응용한다면 사용자가 원하는 데이터를 선택하는데 매우 유용하게 사용할 수 있다.


 Series에서의 사용 예

이 섹션에서는 Series에서 isin메서드의 사용예제에 대해 다룬다.


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

# 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

Out[5]: 

r0    0

r1    1

r2    2

r3    3

r4    4

r5    5

dtype: int32


# isin 메서드의 사용

In[6]: ex_s.isin([5,2,50])

Out[6]: 

r0    False

r1    False

r2     True

r3    False

r4    False

r5     True

dtype: bool


# isin 메서드를 이용한 불린 인덱싱

In[7]: ex_s[ex_s.isin([5,2,50])]

Out[7]: 

r2    2

r5    5

dtype: int32



 DataFrame에서의 사용 예

앞서 서술했다시피 DataFrame또한 isin() 메서드를 지원한다.

isin 메서드를 사용할 때, 각종 배열 또는 딕셔너리를 입력시킬 수 있다.


단순 배열의 입력

값이 단순히 배열인 경우 isin은 원래 DataFrame과 형상이 같은 불린 배열 형태의 DataFrame을 반환한다.

isin 메서드에 입력된 배열에 DataFrame요소가 존재한다면 True를 출력하고 아닌경우 False을 출력한다. 


DataFrame에서 단순배열 입력 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[8]: ex_df=pd.DataFrame(np.arange(9).reshape(3,3),index=['r'+str(x) for x in range(3)], columns=['c'+str(x) for x in range(3)], dtype="int32")

In[9]: ex_df

Out[9]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# 단순 배열 입력 예제

In[10]: ex_df.isin([2,3])

Out[10]: 

       c0     c1     c2

r0  False  False   True

r1   True  False  False

r2  False  False  False


딕셔너리의 입력(각 열에서의 데이터 확인)

사용자는 각 열마다 확인할 데이터를 다르게 설정하고 싶을 경우에는 딕셔너리를 이용하면 된다.

   딕셔너리의 키(key)를 열의 레이블로 설정한다.

   딕셔너리의 값(value)은 사용자가 확인하길 원하는 값을 입력한다.


DataFrame에서 딕셔너리 입력 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[8]: ex_df=pd.DataFrame(np.arange(9).reshape(3,3),index=['r'+str(x) for x in range(3)], columns=['c'+str(x) for x in range(3)], dtype="int32")


# 각 열에 isin메서드 적용 예제 1

In[11]: isin_dict={'c2':[5],'c1':[1,4]}

In[12]: ex_df.isin(isin_dict)

Out[12]: 

       c0     c1     c2

r0  False   True  False

r1  False   True   True

r2  False  False  False


# 각 열에 isin메서드 적용 예제 2

In[13]:isin_dict={'c2':[5],'c1':[1,4],'c0':[0,3,6]}

In[14]:ex_df.isin(isin_dict)

Out[14]: 

      c0     c1     c2

r0  True   True  False

r1  True   True   True

r2  True  False  False


DataFrame의 입력(정확한 위치에 정확한 데이터 확인)

사용자가 정확한 위치에 정확한 데이터가 확인하고 싶은 경우에는 DataFrame을 이용하면 된다.


DataFrame에서 DataFrame 입력 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[14]: ex_df=pd.DataFrame(np.arange(9).reshape(3,3),index=['r'+str(x) for x in range(3)], columns=['c'+str(x) for x in range(3)], dtype="int32")


# DataFrame을 입력한 isin메서드 적용 예제

In[15]: isin_df=pd.DataFrame([[8,7,6],[5,4,3],[2,1,0]], index=['r'+str(x) for x in range(3)], columns=['c'+str(x) for x in range(3)], dtype="int32")

In[16]: ex_df.isin(isin_df)

Out[16]: 

       c0     c1     c2

r0  False  False  False

r1  False   True  False

r2  False  False  False


isin 메서드와 all 및 any 메서드를 조합한 불린인덱싱

isin 메서드에 입력되는 데이터는 일종의 기준이다.

  ○ 이런 기준을 모두 만족하는 행을 선택하고 싶다면 all() 메서드를 같이 조합하여 사용할 수 있다.

  ○ 반대로 기준 중 하나라도 만족하는 행을 선택하려 한다면 any() 메서드를 조합하여 사용하면 된다.


isin 메서드와 all, any 메서드의 조합 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[4]: ex_df=pd.DataFrame(np.arange(9).reshape(3,3),index=['r'+str(x) for x in range(3)], columns=['c'+str(x) for x in range(3)], dtype="int32")

In[17]:isin_dict={'c0':[0],'c1':[1,4],'c2':[2]}


# all() 메서드와의 조합

In[18]: mask1=ex_df.isin(isin_dict).all(1)

In[19]: ex_df[mask1]

Out[19]: 

    c0  c1  c2

r0   0   1   2


# any() 메서드와의 조합

In[20]:mask2=ex_df.isin(isin_dict).any(1)

In[21]:ex_df[mask2]

Out[21]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5



 index(columns)에서의 사용 예

Index 오브젝트에 대해서도 isin 메서드가 적용될 수 있다.

  ○ columns에도 마찬가지로 적용 가능하다. 

이는 사용자가 찾고자하는 레이블(label) 중 어느 것이 실제로 존재하는지 모르는 경우에 유용하다.


index에서의 isin 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

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


In[23]: ex_s.index

Out[23]: Index(['r0', 'r1', 'r2', 'r3', 'r4', 'r5'], dtype='object')


In[24]: ex_s.index.isin([1,'r1','r5'])

Out[24]: array([False,  True, False, False, False,  True], dtype=bool)


MultiIndex에 isin 메서드를 적용 시에는 튜플을 이용하거나, 레벨을 선택할 수 있다.


index에서의 isin 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[25]: ex_s_mul=pd.Series(np.arange(6), index=pd.MultiIndex.from_product([['a', 'b'], ['r0', 'r1', 'r2']]))

In[26]: ex_s_mul

Out[26]: 

a  r0    0

   r1    1

   r2    2

b  r0    3

   r1    4

   r2    5

dtype: int32


In[27]: ex_s_mul.index.isin([('a','r1'),('b','r2')])

Out[27]: array([False,  True, False, False, False,  True], dtype=bool)


In[28]: ex_s_mul.index.isin(['r1','r2'], level=1)

Out[28]: array([False,  True,  True, False,  True,  True], dtype=bool)




 isin() 메서드 옵션 세부사항



 Series.isin(self, values)

values가 Series에 담겨있는지 아닌지 체크한다.

Series의 각각의 요소가 values에 입력된 하나의 요소와 매치되는지 보여주는 불린 Series를 반환한다.


values: set 혹은 list-like

테스트를 하기 위한 값들의 시퀀스를 입력받는다. 

문자열이 입력될 시 TypeError가 발생한다.

따라서 문자열을 list로 변환하여 입력하자.


 DataFrame.isin(self, values)

values가 DataFrame에 담겨있는지 아닌지 체크한다.


values: iterable, Series, DataFrame or dict

모든 라벨이 매칭되는 위치에서만 True를 발생시킨다. 

만약 values가 Series일 경우 그것은 인덱스이다.

values가 dict일 경우 keys은 열의 이름이고, 반드시 매칭되어야 한다.

values가 DataFrame일 경우 인덱스와 열의 라벨이 반드시 매칭되어야 한다. 



 

 

 

 

 참고자료

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

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.isin.html

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

 

 

 

 


반응형

댓글