Numpy 와 Pandas에서 불리언 색인의 활용

Numpy  불리언 색인 기능 소개.


정규 python의 리스트 중첩과 유사하나 보다 쉽게 if 문의 활용 및 다양한 데이터 가공을 가능하게 함.


정규 python의 리스트 중첩은 아래와 같다.


array1 = [1,2,3,4,5]

#이를 리스트 중첩으로 3보다 큰 리스트를 추출할 수 있다.

[x for x in array1 if x > 3]

Out[39]: [4, 5] 


Numpy 에서는 보다 쉽게 array 를 추출 가능.


import numpy as np

array2 = np.array([1,2,3,4,5])

# numpy array 에서 비교 연산자를 바로 적용 시 각 array 값 별로 True , False 값을 반환.

array2 > 3

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

# 1차원 배열에서 3보다 큰 값을 모두 추출함.

array2[array2 > 3]

# True에 해당하는 index array 값만 반환. 

Out[45]: array([4, 5])


불리언 색인은 array의 색인이 True, False 값을 가지게 하여 True 인 경우에 해당 array 값을 출력하게 함.



다음 예제는 Python for Data Analysis 에서 가져온 것이다.

2차원 Numpy 배열에 불리언 색인을 적용한 예제다.


names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])

names

Out[48]:

array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],

      dtype='<U4')

data = np.random.randn(7,4)

data

Out[50]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [-1.18357656,  1.61485173, -0.93498466,  0.62553805],

       [-0.35840121, -0.2164986 , -0.59688896, -0.49594989],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842],

       [ 0.04366381, -0.57763389,  0.16284361, -0.46842905],

       [-0.13914101, -1.09840424,  0.16332229,  0.21295691],

       [ 0.61643143, -1.94844699,  0.18180573, -0.8689196 ]])




비교 연산자 == anames array 에 바로 적용할 때 True,False 값이 각 array 값에 설정되며 이를 불리언 색인으로 사용할 수 있다.  array[0] array[3] 만이 True 이다

names == 'Bob'

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



2차원 배열인 data에 바로 불리언 색인을 적용할 수 있다. Array[0]array[3] True 이므로 data 배열에서 1행과 4행만을 출력한다.

data[names=='Bob']

Out[52]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842]])


출력하려는 행렬을 슬라이스나 숫자 색인을 줘서 제한 할 수 있다. 위의 경우는 불리언 색인으로 추출된 배열에서 2: 3열 이후의 값을 추출함.

data[names=='Bob',2:]

Out[55]:

array([[ 1.87164573,  0.66950956],

       [-1.1023612 ,  0.55036842]])


논리연산자를 이용하여 보다 복잡한 조합도 가능하다.

& (And) , | (Or) 논리 연산자를 이용한 불리언 색인 결과

(names == 'Bob') | (names =='Will')

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

data[ (names=='Bob') | (names == 'Will') ]

Out[61]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [-0.35840121, -0.2164986 , -0.59688896, -0.49594989],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842],

       [ 0.04366381, -0.57763389,  0.16284361, -0.46842905]])


불리언 색인에 기반한 값 대입도 가능하다.

data < 0

Out[66]:

array([[ True, False, False, False],

       [ True, False,  True, False],

       [ True,  True,  True,  True],

       [False,  True,  True, False],

       [False,  True, False,  True],

       [ True,  True, False, False],

       [False,  True, False,  True]], dtype=bool)



# 값 대입

data[data < 0 ] = 0

data

Out[68]:

array([[ 0.        ,  0.29081568,  1.87164573,  0.66950956],

       [ 0.        ,  1.61485173,  0.        ,  0.62553805],

       [ 0.        ,  0.        ,  0.        ,  0.        ],

       [ 0.88574796,  0.        ,  0.        ,  0.55036842],

       [ 0.04366381,  0.        ,  0.16284361,  0.        ],

       [ 0.        ,  0.        ,  0.16332229,  0.21295691],

       [ 0.61643143,  0.        ,  0.18180573,  0.        ]])




다음은 Pandas 에서 이러한 불리언 색인에 기반한 호출을 수행해보자


비교연산자 >= pandas DataFrameValueTrue, False 값이 인덱스별로 설정됨.


df = pd.DataFrame(

{

'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]

}

)

df

Out[82]:

   AAA  BBB  CCC

0    4   10  100

1    5   20   50

2    6   30  -30

3    7   40  -50



df.AAA >=5

Out[74]:

0    False

1     True

2     True

3     True

Name: AAA, dtype: bool



AAA 필드가 5보다 크거나 같은 인덱스의 값만이 출력됨.  

df[df.AAA >=5]

Out[73]:

   AAA  BBB  CCC

1    5   20   50

2    6   30  -30

3    7   40  -50




ix 함수를 사용하면 더욱 다양한 활용이 가능하다.

Ix 를 이용하여 원하는 필드만 추출 가능하다. 위 예제 에서는 AAA BBB 컬럼만을 추출하였다.

물론 동일한 결과를 아래의 Slicing 을 통해서도 얻을 수 있다.

df.ix[df.AAA >=5]

Out[72]:

   AAA  BBB  CCC

1    5   20   50

2    6   30  -30

3    7   40  -50

df.ix[df.AAA >=5 ,['AAA','BBB']]

Out[78]:

   AAA  BBB

1    5   20

2    6   30

3    7   40

df.ix[df.AAA >=5, :2]

Out[79]:

   AAA  BBB

1    5   20

2    6   30

3    7   40




데이터의 입력도 가능하다.
AAA 컬럼값이 5 이상인 레코드를 대상으로 BBB 컬럼을 -1 로 새롭게 입력하였다.


df.ix[df.AAA >=5,'BBB'] = -1

df

Out[84]:

   AAA  BBB  CCC

0    4   10  100

1    5   -1   50

2    6   -1  -30

3    7   -1  -50





Pandaswhere 함수를 사용하면 기존 값의 가공에 따라 데이터를 새로운 컬럼값으로 입력할 수 있다.

In [7]: df = pd.DataFrame( ...: {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})

df ...: Out[7]:

AAA BBB CCC

0 4 10 100

1 5 20 50

2 6 30 -30

3 7 40 -50

In [8]: df['logic'] = np.where(df['AAA'] > 5,'high','low')

df

Out[8]:

AAA BBB CCC logic

0 4 10 100 low

1 5 20 50 low

2 6 30 -30 high

3 7 40 -50 high



+ Recent posts