research blog for data science

pandas.DataFrame.any(), numpy.any()

|

평소에 헷갈리는 any(), all()에 대해 정리하였습니다.


df.isna()

In [1]:
import pandas as pd
In [2]:
df = pd.read_csv('./data/top1_1880109251922.csv', index_col=[0])
df['date'] = pd.to_datetime(df['date'])
df['Date'] = pd.to_datetime(df['date'])
df = df.set_index('Date')
df = df.asfreq('D')

df.isna()는 데이터프레임에서 NaN 요소에 해당되는 부분을 True로 리턴해준다.

In [3]:
df.isna()
date store product_c sales
Date
2018-02-01 False False False False
2018-02-02 False False False False
2018-02-03 False False False False
2018-02-04 False False False False
2018-02-05 False False False False
... ... ... ... ...
2019-07-27 True True True True
2019-07-28 True True True True
2019-07-29 False False False False
2019-07-30 False False False False
2019-07-31 False False False False

546 rows × 4 columns

df.any()

여기서, dataframe.any(axis=0)인 경우엔 각 column의 row를 다 훑어서, row요소들 중 적어도 하나의 row애 True가 있으면, True를 반환합니다.

In [4]:
df.isna().any(axis=0)
date         True
store        True
product_c    True
sales        True
dtype: bool

반면에, dataframe.any(axis=1)인 경우엔 각 index별로 column요소를 다 훑어서 적어도 하나의 column에 True가 있으면 True를 반환합니다. 아래 코드를 보면, 해당 index에 data, store, product_c, sales가 모두 True이면 해당 index row는 True를 반환합니다.

In [5]:
df.isna().any(axis=1)
Date
2018-02-01    False
2018-02-02    False
2018-02-03    False
2018-02-04    False
2018-02-05    False
              ...  
2019-07-27     True
2019-07-28     True
2019-07-29    False
2019-07-30    False
2019-07-31    False
Freq: D, Length: 546, dtype: bool

np.any()

np.any() 는 dataframe.any()와 유사합니다. 주어진 축(axis) 정보에 따라 해당 요소에서 True가 하나 이상이라도 있으면 True를 반환합니다. 아래는 np.any()의 예제입니다.

In [6]:
import numpy as np

먼저, 예제 array를 생성합니다. True, False로 구성된 random한 array를 만들었습니다.

In [7]:
samplearr = [True, False]
a = np.random.choice(samplearr, size=(47))
b = np.random.choice(samplearr, size=(47))
c = np.random.choice(samplearr, size=(47))
print(a)
print(b)
print(c)
[ True  True  True  True  True  True False  True  True  True False False
 False  True False  True False False False False  True False  True  True
 False  True False False False  True False  True False  True  True False
 False  True False False  True False False  True  True  True False]
[False False  True False  True False  True  True False  True  True False
  True False  True False False False False False  True  True False False
 False False  True False False  True False False False  True False  True
  True  True False False  True  True  True  True False  True  True]
[False False  True False False False False  True False False  True  True
  True False False  True  True  True  True False False False False  True
 False  True  True  True  True  True  True  True False False False  True
 False False False False False False  True  True  True  True  True]

np.any(a,b,c)는 에러를 발생합니다. 반드시, 하나의 array나 아니면 array와 유사한 list형식으로 묶어서 넣어줘야합니다.

In [8]:
np.any(a,b,c)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-7a7facd3228c> in <module>
----> 1 np.any(a,b,c)
<__array_function__ internals> in any(*args, **kwargs)
/opt/anaconda3/lib/python3.7/site-packages/numpy/core/fromnumeric.py in any(a, axis, out, keepdims)
   2328 
   2329     """
-> 2330     return _wrapreduction(a, np.logical_or, 'any', axis, None, out, keepdims=keepdims)
   2331 
   2332 
/opt/anaconda3/lib/python3.7/site-packages/numpy/core/fromnumeric.py in _wrapreduction(obj, ufunc, method, axis, dtype, out, **kwargs)
     85                 return reduction(axis=axis, out=out, **passkwargs)
     86 
---> 87     return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
     88 
     89 
TypeError: only integer scalar arrays can be converted to a scalar index

axis=0 vs. axis=1

그전에 axis=0과 1에 따라 차이를 살펴봅시다. axis=0인 경우엔 각 column의 모든 row를 훑고, axis=1인 경우엔 각 row의 모든 column을 훑습니다. 아래는 관련 그림입니다.

jpg

axis=0인 경우, 각각의 column요소에서 모든 row를 훑어서 하나 이상이 True요소라면 True를 반환합니다. 결과는 [a,b,c]의 column의 갯수만큼 출력됩니다.

In [9]:
np.any([a,b,c], axis=0)
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True, False,  True,  True,  True,  True, False,  True,  True,
        True,  True,  True,  True,  True, False,  True,  True,  True,
        True,  True, False, False,  True,  True,  True,  True,  True,
        True,  True])

axis=1인 경우, 각각의 row요소에서 모든 column을 훑어서 하나 이상이 True요소라면 True를 반환합니다. 결과는 [a,b,c]의 row 갯수만큼 출력됩니다.

In [10]:
np.any([a,b,c], axis=1)
array([ True,  True,  True])

np.all()

np.all()은 np.any()와 반대로, 검사할 축에 모든 요소가 True여야지만 True를 반환합니다. 아래는 예제입니다.

In [11]:
np.all([a,b,c], axis=0)
array([False, False,  True, False, False, False, False,  True, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False,  True, False, False, False, False, False, False,
       False, False, False, False, False, False, False,  True, False,
        True, False])
In [12]:
np.all([a,b,c], axis=1)
array([False, False, False])

Comments