[Python pandas] 여러개 칼럼의 조건을 일부(any) 또는 전부(all) 만족하는 행 가져오기
Python 분석과 프로그래밍/Python 데이터 전처리 2021. 11. 21. 16:38이번 포스팅에서는 Python의 pandas DataFrame 에서 여러개 칼럼의 조건을 일부(any)만 또는 전부(all) 만족하는 행 가져오기하는 방법을 소개하겠습니다.
pandas DataFrame의 any(), all() 메소드를 이용하면 매우 간단하게 조건을 만족하는 행을 색인해서 가져올 수 있습니다.
(1) pandas DataFrame 의 칼럼 중에서 1개 이상의 칼럼이 True 인 행 가져오기: pd.DataFrame.any(axis=1)
(2) pandas DataFrame 의 칼럼 중에서 모든 칼럼이 True 인 행 가져오기: pd.DataFrame.all(axis=1)
먼저, 예제로 사용할 간단한 pandas DataFrame 을 만들어 보겠습니다. 4개의 칼럼을 가지고 있고, 결측값도 하나 넣어습니다.
import pandas as pd
import numpy as np
## creating a sample DataFrame with 4 columns
df = pd.DataFrame({
'x1': [0, 1, 2, 3, 4],
'x2': [-2, -1, 0, 1, 3],
'x3': [-4, -3, -2, -1, -4],
'x4': [np.nan, 0, 2, 3, -10]
})
print(df)
# x1 x2 x3 x4
# 0 0 -2 -4 NaN
# 1 1 -1 -3 0.0
# 2 2 0 -2 2.0
# 3 3 1 -1 3.0
# 4 4 3 -4 -10.0
(1) pandas DataFrame 의 칼럼 중에서 1개 이상의 칼럼이 True 인 행 가져오기: pd.DataFrame.any(axis=1)
아래처럼 np.abs(df) > 2 를 하면 모든 칼럼의 모든 행에 대해서 절대값(absolute value)이 2보다 큰지 아닌지 여부에 대해 True/False 블리언 값을 반환합니다.
## returns boolean for all columns and rows
np.abs(df) > 2
# x1 x2 x3 x4
# 0 False False True False
# 1 False False True False
# 2 False False False False
# 3 True False False True
# 4 True True True True
이제 칼럼 4개 중에서 절대값(absolute value)이 2보다 큰 값이 단 하나라도 존재하는 행을 가져와 보겠습니다. 이때 '칼럼들에 대해 단 하나라도 존재하면'이라는 조건 판단은 pandas.DataFrame.any(axis=1) 메소드를 사용하면 편리합니다.
any(axis =1) 에서 axis=1 을 설정해주면 칼럼 축을 기준으로 조건 만족여부를 평가합니다. 기본설정값이 axis=0 이므로 반드시 명시적으로 any(axis=1) 처럼 축을 지정해주어야 합니다.
결측값이 있어도 다른 칼럼에서 조건을 만족하면 해당 행을 가져옵니다.
## (1) DataFrame.any(axis=0, bool_only=None, skipna=True, level=None, **kwargs)
## pd.DataFrame.any(): Return whether any element is True, potentially over an axis.
df[(np.abs(df) > 2).any(axis=1)]
# x1 x2 x3 x4
# 0 0 -2 -4 NaN
# 1 1 -1 -3 0.0
# 3 3 1 -1 3.0
# 4 4 3 -4 -10.0
pandas.DataFrame.any(axis=1) 메소드를 사용하지 않고, 아래처럼 블리언 값(True=1, False=0)을 칼럼 축으로 더해서(sum(axis=1)), 그 더한 값이 0보다 큰 행을 인덱싱해서 가져오는 방법을 써도 되긴 합니다.
## or equivalantly
df[(np.abs(df) > 2).sum(axis=1) > 0]
# x1 x2 x3 x4
# 0 0 -2 -4 NaN
# 1 1 -1 -3 0.0
# 3 3 1 -1 3.0
# 4 4 3 -4 -10.0
(2) pandas DataFrame 의 칼럼 중에서 모든 칼럼이 True 인 행 가져오기: pd.DataFrame.all(axis=1)
이번에는 pandas.DataFrame.all(axis=1)을 이용해서 DataFrame에 있는 4개의 모든 칼럼이 조건을 만족하는 행만 가져오기를 해보겠습니다.
## DataFrame.all(axis=0, bool_only=None, skipna=True, level=None, **kwargs)
## Return whether all elements are True, potentially over an axis.
df[(np.abs(df) > 2).all(axis=1)]
# x1 x2 x3 x4
# 4 4 3 -4 -10.0
아래는 pandas.DataFrame.all() 메소드를 사용하지 않고, 대신에 조건 만족여부에 대한 블리언 값을 칼럼 축으로 전부 더한 후, 이 블리언 합이 칼럼 개수와 동일한 행을 가져와본 것입니다. 위의 pandas.DataFrame.all(axis=1) 보다 코드가 좀더 길고 복잡합니다.
## or, equivalently
df[(np.abs(df) > 2).sum(axis=1) == df.shape[1]]
# x1 x2 x3 x4
# 4 4 3 -4 -10.0
[ Reference ]
* pandas.DataFrame.any() : https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.any.html
* pandas.DataFrame.all(): https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.all.html
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)