판다스 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 함수에 대한 사용 예제는 이전에 따로 다룬 적이 있어
아래에 해당 글의 링크를 첨부하고, 여기서는 추가 논의를 생략하겠습니다.
'Python > Pandas' 카테고리의 다른 글
[Pandas] 파이썬 인덱스 설정 방법 정리(set_index 함수) (2) | 2022.03.01 |
---|---|
[Pandas] 데이터프레임 생략 없이 출력 방법(display 옵션) (1) | 2022.02.14 |
[Pandas] 파이썬 데이터프레임 중복 제거 : drop_duplicates() 사용법 (0) | 2022.01.17 |