Pandas where 사용법 - Pandas where sayongbeob

판다스 where 함수 Series, DataFrame 사용 예제

안녕하세요. 이번 글에서는 pandas 라이브러리에서

시리즈 혹은 데이터프레임 내 조건 탐색 및 대치에 활용되는

pd.where 함수의 사용법에 대한 예제를 살펴보도록 하겠습니다.

참고로, 이 글은 판다스 공식 문서의 pd.where 함수 설명 글을 바탕으로 작성되었음을 알립니다.

Series에 적용 케이스 1 : 조건 만족 행 필터링

먼저, 열 1개에 해당하는 Series 자료형에 where 함수를 적용하는 예시를 살펴보겠습니다.

아래와 같은 5개의 원소를 가진 간단한 시리즈를 생각해보겠습니다.

import pandas as pd

sr = pd.Series([1, 5, 3, 2, 4])
sr

###
0    1
1    5
2    3
3    2
4    4
dtype: int64

여기에 만일 특정 조건을 만족하는 행들의 값만 filtering하고,

나머지 행들은 NaN 값으로 대치하고 싶은 경우 where 함수를 적용할 수 있습니다.

아래의 예시는 원소가 3보다 큰 행들의 값만 남긴 예시입니다.

sr.where(sr > 3)

###
0    NaN
1    5.0
2    NaN
3    NaN
4    4.0
dtype: float64

Series에 적용 케이스 2 : 조건을 만족하지 않는 행 값 대치

시리즈 자료형에 where 함수를 적용하는 또다른 방법은

조건 뒤에 두 번째 인자로 조건이 만족되지 않는 행에서 NaN 대신 대치될 값

적어줄 수 있습니다.

아래의 예시는 3보다 큰 행은 원래 원소로 남기고,

3보다 작거나 같은 행은 100으로 값을 대치한 경우입니다.

sr.where(sr > 3, 100)

###
0    100
1      5
2    100
3    100
4      4
dtype: int64

DataFrame에 적용 케이스 1 : 조건 만족 행 필터링

데이터프레임에 where 함수를 적용하는 경우에도 Series에 사용하는 경우와

기본적인 사용 방법은 동일합니다.

다만, 각 열들의 값을 기준으로 더 복잡한 조건을 지정할 수 있다는 특징이 있습니다.

아래와 같은 간단한 데이터프레임을 예시로 사용 방법을 익혀보겠습니다.

df = pd.DataFrame({'a' : [1, 5, 3, 2, 4], 'b' : [4, 4, 4, 2, 2]})

df

###
	a	b
0	1	4
1	5	4
2	3	4
3	2	2
4	4	2

먼저, 데이터프레임의 모든 열에 같은 조건을 부여한 경우의 예시입니다.

여기서는 각 행마다 3 초과인 경우만 값을 생존시키는 상황을 가정해보겠습니다.

df.where(df > 3)

###
	a	b
0	NaN	4.0
1	5.0	4.0
2	NaN	4.0
3	NaN	NaN
4	4.0	NaN

a열, b열에서 각각 원소가 3보다 큰 경우만 값이 남아있는 것을 알 수 있습니다.

이번에는 특정 열의 조건을 기준으로 더 복합적인 필터링을 진행해보겠습니다.

예를들어, a와 b열의 값이 모두 3보다 큰 행만 통째로 남기고 싶은 경우 예시입니다.

df.where((df['a'] > 3) & (df['b'] > 3))

###

	a	b
0	NaN	NaN
1	5.0	4.0
2	NaN	NaN
3	NaN	NaN
4	NaN	NaN

a와 b가 모두 3보다 컸던 두번째 행(1번 인덱스)만 값이 남아있고,

나머지 행들은 두 열 모두 NaN으로 값이 대치되었습니다.

DataFrame에 적용 케이스 2 : 조건을 만족하지 않는 행 값 대치

이 경우도 시리즈에 where 함수를 적용한 경우와 마찬가지로,

두번째 인자에 NaN 대신 대치할 값을 적어주시면 됩니다.

다만, 각 열마다 바꿀 값을 다르게 지정할 수 있다는 점이 큰 장점입니다.

먼저, 대치할 값을 원래 원소의 -1배로 지정한 경우의 예시입니다.

df.where(df > 3, -df)

###

	a	b
0	-1	4
1	5	4
2	-3	4
3	-2	-2
4	4	-2

3보다 값이 작았던 원소들은 원래 값에서 마이너스 부호를 붙인 값으로 대치되었습니다.

이번에는 두 열에 다른 원소로 값을 대치한 경우입니다.

두번째 인자로 각 열마다 변경할 값을 리스트 등 형태로 지정해주시면 됩니다.

df.where((df['a'] > 3) & (df['b'] > 3), [100, 200])

###
	a	b
0	100	200
1	5	4
2	100	200
3	100	200
4	100	200

a열은 100, b열은 200으로 값이 다르게 지정된 결과를 살펴볼 수 있었습니다.

번외 : np.where vs pd.where

판다스 라이브러리의 where 함수는 넘파이의 np.where 함수와

사용법 및 용도가 꽤 유사하긴 합니다.

다만,

np.where과 pd.where의 차이점은 np.where은 해당 원소 값 대신 위치를 가져온다는 점

값이 True인 위치에도 대치할 값 지정이 가능하다는 점입니다.

넘파이의 where 함수에 대한 사용 예제는 이전에 따로 다룬 적이 있어

아래에 해당 글의 링크를 첨부하고, 여기서는 추가 논의를 생략하겠습니다.

[Numpy] np.where 사용법 : 조건 만족하는 위치 인덱스 찾기

파이썬 넘파이 np.where : 조건 만족 인덱스 반환 파이썬에서 넘파이를 사용하다보면, np.where 함수를 자주 만나게 됩니다. 만날때 마다 복잡해보이지만, 사실 알고보면 매우 간단한 np.where 함수의

jimmy-ai.tistory.com

Pandas where 사용법 - Pandas where sayongbeob

Dataframe에 저장한 데이터중 특정 값만 출력하고 싶은 경우가 있습니다.

이러한 경우에는 where() 사용해 조건과 일치하는 데이터 행만 출력할 수 있습니다.

where

whereDataframe 원하는 컬럼에 조건을 설정해 해당하는 데이터행의 값만 출력합니다.

샘플을 보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

# DataFrame 샘플 데이터
#     A  B  C
# 0 -20  1  a
# 1 -10  2  b
# 2   0  3  b
# 3  10  4  b
# 4  20  5  a

print(df.where(df['C'] == 'a'))

결과

        A      B     C
0   -20.0   1.0      a
1   NaN  NaN  NaN
2   NaN  NaN  NaN
3   NaN  NaN  NaN
4   20.0    5.0      a

Dataframe C항목where 조건을 지정했습니다.

C항목 값이 a인 행 데이터만 출력하고 있습니다.

조건과 일치하지 않은 행은 NaN을 표시하고 있습니다.

NaN대신에 다른 값을 표기하고 싶은 경우에는 두 번째 파라미터를 지정합니다.

df.where(검색 조건, NaN 표시값)
import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where(df['C'] == 'a', 0))

결과

    A    B   C
0  -20  1   a
1    0   0   0
2    0   0   0
3    0   0   0
4   20  5   a

조건과 일치하지 않은 데이터 행은 결측값 NaN대신에 0으로 출력하고 있습니다.

만약 조건과 일치하지 않은 결측값 NaN을 표시하고 싶지 않은 경우에는 dropna를 사용합니다.

자세한 내용은 아래를 참조해주세요.

Python DataFrame 결측값 제거 dropna 사용 방법

DataFrame에서 검색 조건을 지정해 조건과 일치하는 데이터만 찾고 싶은 경우 where()를 사용합니다. where()에 지정한 조건과 일치하는 데이터는 값이 표시가 됩니다. 조건과 일치하지 않는 데이터는

ponyozzang.tistory.com

Pandas where 사용법 - Pandas where sayongbeob
where 복수 조건

검색 조건을 복수로 설정하는 방법을 알아보겠습니다.

복수 조건으로 AND 조건 또는 OR 조건을 지정할 수 있습니다.

AND 조건 사용 방법을 알아보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where((df['C'] == 'a') & (df['A'] == 20)))

결과

      A     B     C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 20.0    5.0     a

검색조건은 C컬럼 값이 a이고 A컬럼 값에 20인 행만 출력하도록 하고 있습니다.

2개의 조건과 일치하는 데이터는 인덱스가 4인 행입니다.

나머지 데이터행은 NaN으로 표시되고 있습니다.

이번에는 OR 조건을 사용해 검색하는 방법을 알아보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where((df['C'] == 'a') | (df['A'] == 10)))

결과

        A      B      C
0  -20.0    1.0     a
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3   10.0    4.0     b
4   20.0    5.0     a

검색 조건은 C컬럼 값이 a 또는 A컬럼 값이 10인 행만 출력하도록 하고 있습니다.

2개의 조건과 일치하는 데이터는 인덱스가 0,3,4인 행입니다.

조건과 일치하지 않는 데이터행은 NaN으로 표시되고 있습니다.

!=T 조건

값이 일치하지 않는 조건을 설정하는 방법을 보겠습니다.

값이 일치하는 조건으로는 == 를 사용합니다.

일치하지 않는 조건을 검색하고 싶은 경우에는 !=를 사용합니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where(df['C'] != 'a'))

결과

       A      B      C
0  NaN  NaN  NaN
1  -10.0   2.0       b
2     0.0   3.0       b
3   10.0   4.0       b
4  NaN  NaN  NaN

검색 조건으로 C컬럼의 값이 a가 아닌 데이터행은 검색하고 있습니다.

조건과 일치하는 데이터는 인덱스 1,2,3행입니다.

인덱스 0,4는 조건에 해당되지 않기 때문에 NaN으로 표시되고 있습니다.