해피러너의 Ns

np.where() 활용하여 조건에 맞는 값 위치 찾기 및 다른 값으로 대체하기 본문

파이썬(Python)/넘파이(numpy)

np.where() 활용하여 조건에 맞는 값 위치 찾기 및 다른 값으로 대체하기

예쁜구슬 2021. 5. 7. 17:43

np.where (condition, x, y)

- 조건(condition)에 부합하면 x, 아니면 y를 출력한다

- x, y는 생략 가능하며, 이 경우에는 조건에 부합하는 index를 출력한다.

- numpy.ndarray로 반환된다.

 

우선, 간단하게 1차원 배열에 적용해보면, 30보다 크거나 같은 값의 위치를 반환한다.

1
2
3
4
5
= np.array([10,20,30,40])
np.where(a>=30)
 
결과
(array([23], dtype=int64),)
cs

 

그러면 데이터 프레임에 적용해보자.

1
2
3
4
5
6
7
test = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=list('abc'))
test
 
    a    b    c
0    1    2    3
1    4    5    6
2    7    8    9
cs

 

조건에 부합하는 값의 위치값을 반환한다.

첫번째 array는 행, 두번째 array는 열 위치라고 생각하면 된다.

1
2
3
4
np.where((test<2| (test>7))
 
결과
(array([022], dtype=int64), array([012], dtype=int64))
cs

 

특정 칼럼으로 좁혀서도 가능하다.

1
2
3
4
np.where((test[['a','b']]<2| (test[['a','b']]>7))
 
결과
(array([02], dtype=int64), array([01], dtype=int64))
cs

 

 

이제 np.where(조건, x, y)를 적용해보자.

아래 예시는 조건에 만족하면 즉 2보다 작거나 7보다 크면, 'NA'로 대체, 아니면 본래 값 그대로 활용한다는 뜻이다.

1
2
3
4
5
6
np.where( (test<2| (test>7), 'NA', test)
 
결과
array([['NA''2''3'],
       ['4''5''6'],
       ['7''NA''NA']], dtype='<U21')
cs

 

 

데이터분석 시, 데이터프레임에서 어떤 조건에 속하는 값은 특정 값으로 대체하고자 할 때 활용가능하다.

예를 들어, 최소/최대값 대체

1
2
3
4
5
6
7
columns = test.columns
test = pd.DataFrame(np.where (test<22, test), columns=columns) # 2보다 작은 값을 2로 대체
test
    a    b    c
0    2    2    3
1    4    5    6
2    7    8    9
cs

 

Comments