본문 바로가기
Python/Pandas

불린 배열(boolean array)을 이용한 인덱싱-pandas(14)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 불린 배열을 이용한 인덱싱


본 포스팅에서는 불린 배열을 이용한 인덱싱에 대해 살펴볼 것이다.


  불린 배열(boolean array) 설명


먼저 불린자료형(논리자료형)에 대한 설명으로는 다음과 같다.

   불린 자료형(논리 자료형)은 엄밀히 말하면 정수형 자료형 중 일부이다.

   0(False, 거짓)과 1(True, 참)으로만 구성되어 있다.


불린 배열(boolean array)은 말 그대로 불린 자료형으로 이루어진 배열을 의미한다.

   즉, 배열 내부에 True와 False만이 존재한다. 


불린 배열 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 불린배열의 예

In[4]: np.array([[True,True,False], [True,False,True], [False,False,True]])

Out[4]: 

array([[ True,  True, False],

       [ True, False,  True],

       [False, False,  True]])


 불린 자료형과 관련된 연산자

불린 자료형과 관련된 연산자로는 크게 두 가지가 존재한다.

논리연산자와 비교연산자가 바로 그것이다.

다음 표 1은 논리연산자를 설명한 표이며, 표 2는 비교연산자를 설명한 표이다. 

이런 자료형들에 대한 설명은 선행 포스팅(링크)를 참고할 수 있다. 


표 1. 논리연산자의 종류

연산자

 기호

 사용 예

의미 

and

&

and y

 x와 y가 둘 다 True이면 True를 출력하고 둘 중 하나라도 False이면 False를 출력한다.

or

|

or y

 x와 y가 둘 다 False이면 False을 출력하고 둘 중 하나라도 True이면 True을 출력한다.

not

~

not x

 x가 True면, False를, x가 False이면 True를 출력한다.(반대로 출력)


표 2. 비교연산자의 종류

 연산자

의미 

<

작다.

<=

작거나 같다.

>

크다.

>=

크거나 같다.

==

같다.

!=

같지 않다.

is

객체 아이덴티티가 같다.

is not

객체 아이덴티티가 다르다.



 불린배열(boolean array)과 생성법

불린배열은 위의 비교연산자와 논리연산자를 사용하여 생성 하는 것이 가능하다.

단순하게 형상이 동일한 배열끼리 비교연산자를 통해 비교하거나 아니면 배열과 스칼라를 비교하면 생성된다.

또한 논리연산자를 사용하여 비교연산의 범위를 확장시키는 것이 가능하다.


불린 배열 생성 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 배열 생성

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

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


# 하나의 상수와의 비교

In[7]: ex_df1>5

Out[7]: 

       c0     c1     c2

r0  False  False  False

r1  False  False  False

r2   True   True   True


# 두 배열간의 비교

In[8]: ex_df1>ex_df2

Out[8]: 

       c0     c1     c2

r0  False  False  False

r1  False  False  False

r2   True   True   True


# 비교연산자와 논리연산자의 조합

In[9]: (ex_df1 == ex_df2) | (ex_df1 > ex_df2)

Out[9]: 

       c0     c1     c2

r0  False  False  False

r1   True   True   True

r2   True   True   True


사용시 주의사항

  논리연산자를 조합하여 사용할 시에 반드시 소괄호 ( )로 그룹핑이 되어야 한다.

    ○ 이는 기본적으로 파이썬은 하나의 표현식으로 표현하기 때문이다.

    ○ 예를들어 df.A>2 & df.B<3 는 df.A > 2( & df.B) < 3으로 인식한다.

    ○ 그러므로 (df.A>2) & (df.B<3) 로 사용하자.


특정 행 또는 특정 열에 대해서도 다음과 같이 불린 배열이 생성 가능하다.

이는 비교연산자 및 논리연산자와 인덱서를 사용하여 가능하다.


불린 배열 생성 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 배열 생성

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


# 열의 불린 배열 출력

In[11]: ex_df1['c1'] < 5 

Out[11]: 

r0     True

r1     True

r2    False

Name: c1, dtype: bool


# 행의 불린 배열 출력

In[12]: ex_df1.loc['r1'] < 5 

Out[12]: 

c0     True

c1     True

c2    False



 불린 배열을 사용한 인덱싱 예



 대괄호를 이용한 불린 인덱싱

불린 배열을 이용하여 불린 인덱싱을 수행하는 것은 생각보다 간단하다.

아래 구문형식과 같이 단순하게 대괄호에 불린 배열을 입력하면된다.


불린 인덱싱의 단순한 구문 형식)

Data[ boolean_array ]  # Series에서의 요소 선택 


여기서 Data는 DataFrame과 Series를 포함하는 데이터 형태이다.

boolean_array에는 DataFrame일 경우 1차원 배열(Series)이나 2차원 배열(DataFrame) 형태 모두 포함될 수 있다.


참고사항

  Series에서의 불린인덱싱

     boolean_array의 요소 수는 기존 Series의 요소 수동일해야한다.

  DataFrame에서의 불린인덱싱

    ○ 1차원의 boolean_array 입력될 경우, boolean_array의 요소 수는 기존 Data의 행의 수와 동일해야한다.

      ▷ 열의 수가 아니라 행의 수가 같아야 한다는 점에 주의하자.

    ○ 2차원의 boolean_array 입력될 경우, boolean_array는 기존 DataFrame과 동일한 형상(같은 행과 열)이어야 한다.


대괄호를 활용한 불린 인덱싱 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 배열 생성

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


# 열의 불린 배열 출력

In[13]: ex_df1[ (ex_df1>6) | (ex_df1<2) ]

Out[13]: 

     c0    c1    c2

r0  0.0   1.0   NaN

r1  NaN   NaN   NaN

r2  NaN   7.0   8.0

r3  9.0  10.0  11.0


In[14]: ex_df1[ (ex_df1['c0']>5) ]

Out[14]: 

    c0  c1  c2

r2   6   7   8

r3   9  10  11


In[15]: ex_df1[ [False, True, False, False ] ]

Out[15]: 

    c0  c1  c2

r1   3   4   5



 .iloc 및 .loc 메서드를 활용한 불린 인덱

.iloc 메서드 .loc 메서드에 불린 인덱싱을 할 경우에는 1차원 불린배열을 입력받을 수 있다.

   입력받는 불린배열의 요소 수는 DataFrame의 행의 수와 같아야한다.

  ○ Series에서는 Series의 길이(요소 수)와 입력받는 불린 배열의 요소 수가 동일해야한다.

  ○ .iloc 및 .loc 메서드를 활용한 불린인덱싱은 동일한 방법으로 수행된다.


.iloc 및 .loc 메서드 활용을 통한 불리인덱싱 구문 형식)

Data.iloc[ boolean_array  

Data.loc[ boolean_array 


.iloc 및 .loc 메서드 활용 불린인덱싱 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 배열 생성

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


In[16]: ex_df1.loc[ (ex_df1['c0']>5) ]

Out[16]: 

    c0  c1  c2

r2   6   7   8

r3   9  10  11


In[17]: ex_df1.iloc[ [False, True, False, False ] ]

Out[17]: 

    c0  c1  c2

r1   3   4   5



 더 복잡한 불린 인덱싱

리스트 컴프리헨션이나 Series의 map 메서드를 활용하면 더욱 복잡한 기준을 만들어 사용할 수 있다.

 

리스트 컴프리헨션 및 Series의 map 메서드를 활용한 불린인덱싱 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 배열 생성

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


# 첫번째 열의 숫자가 홀수 및 짝수인지 확인하는 불린 배열 생성

In[18]: criterion_1 = [ jj%2!=0 for jj in ex_df1['c0']]

In[19]: criterion_2 = ex_df1['c0'].map( lambda x: x%2==0 )


# 위의 기준을 만족하는 불린인덱싱 수행

In[20]: ex_df1[criterion_1]

Out[20]: 

    c0  c1  c2

r1   3   4   5

r3   9  10  11


In[21]: ex_df1.loc[criterion_2]

Out[21]: 

    c0  c1  c2

r0   0   1   2

r2   6   7   8




반응형

댓글