[Python] pd.where과 np.where의 차이

업데이트:

import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[10,20,30,40,50]})
df
a b
0 1 10
1 2 20
2 3 30
3 4 40
4 5 50

1. 판다스의 Series객체.where()함수

이 함수는 Series객체1.where(Series객체에 대한 조건문, 거짓 값에 대한 대체 값)의 형태로 사용한다.
조건문의 참값에 대해서는 Series1객체의 값을 넣어준다.

df['a'].where(df['a'] < 3, 10)
0     1
1     2
2    10
3    10
4    10
Name: a, dtype: int64

a열 중 3보다 작은 값(1,2)에는 그대로 a열의 값, 3이상인 값에 대해서는 10을 넣는다.

df['b'].where(df['a'] < 3, 100)
0     10
1     20
2    100
3    100
4    100
Name: b, dtype: int64

a열 중 3보다 작은 값(1,2)에는 b열의 값, 3이상인 값에 대해서는 100을 넣는다.

2. 넘파이의 np.where()함수

이 함수는 np.where(배열에 대한 조건문, 참일때 값, 거짓일때 값)의 형태로 사용하며 배열(array)로 반환한다.
위의 판다스 where함수를 똑같이 재현해보자.

np.where(df['a'] < 3, df['a'],10)
array([ 1,  2, 10, 10, 10], dtype=int64)

이는 조건문에 대해 참일때와 거짓일때를 조금 더 자유롭고 유연하게 구현할 수 있는 장점이 있는 것 같다.

df['where_a'] = np.where(df['a'] < 3, '3미만','3이상')
df['where_b'] = np.where(df['b'].isin([10, 30]), 'O', 'X')
df
a b where_a where_b
0 1 10 3미만 O
1 2 20 3미만 X
2 3 30 3이상 O
3 4 40 3이상 X
4 5 50 3이상 X

댓글남기기