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 ]])
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 의 DataFrame의 Value에 True, 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
Pandas의 where 함수를 사용하면 기존 값의 가공에 따라 데이터를 새로운 컬럼값으로 입력할 수 있다.
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
'개발 > Python' 카테고리의 다른 글
IPython 에서 matplotlib import 시 cannot import name 'QtCore' 오류 발생 처리 (0) | 2016.09.29 |
---|---|
with.. as 절의 사용법 (0) | 2016.09.21 |
Python mmap(Memory Mapped File) 함수 (0) | 2016.09.20 |
Numpy array 를 shape로 차원확인 하기 (0) | 2016.09.19 |
Python에서는 증감연산자 ++,-- 가 없다 (0) | 2016.09.19 |