Python/Pandas

[Pandas] pd.where 사용법, 경우의 수 정리

jimmy_AI 2022. 2. 20. 18:00
반응형

판다스 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