Методы .all() и .any() объектов Series/DataFrame в
pandas
работают аналогично одноименным функциям Python. В материале даны пояснения: как и где использовать эти методы на практике при анализе данных.
.all()
и .any()
.DataFrame.all()
- возвращают True
, если ВСЕ элементы вдоль оси Dataframe
являются True
;Series.all()
- возвращают True
, если ВСЕ элементы в Series
являются True
;DataFrame.all()
- возвращают True
, если хотя бы ОДИН элемент вдоль оси Dataframe
являются True
;Series.all()
- возвращают True
, если хотя бы ОДИН элемент в Series
являются True
;.all()
и .any()
В pandas
есть много методов, которые на выходе возвращают DataFrame
/Series
с "логической индексацией".
Например, есть такой метод DataFrame.isna()
(возвращает DataFrame
со значениями bool
найденных значений NA
) или метод DataFrame.isin()
(проверяет наличие элемента DataFrame
в списке значений) и много других методов... В таких случаях начинающие пользователи всегда задаются вопросом: - "А как же посмотреть/вывести на печать строки/столбцы с найденными значениями?" Здесь как раз на помощь приходят рассматриваемые методы.
Возьмем к примеру метод DataFrame.isin()
и следующий DataFrame
:
>>> import pandas as pd df = pd.DataFrame({'num_legs': [2, 4], 'num_wings': [2, 0]}, index=['falcon', 'dog']) >>> df # num_legs num_wings # falcon 2 2 # dog 4 0
Проверим, все ли значения DataFrame
присутствуют в списке [0, 2]
# совпавшие значения будут `True` >>> df.isin([0, 2]) # num_legs num_wings # falcon True True # dog False True
Для просмотра столбцов, все элементы которых имеют вхождения в список [0, 2]
, можно использовать метод DataFrame.all()
:
>>> df.loc[:, df.isin([0, 2]).all()] # num_wings # falcon 2 # dog 0
Для просмотра строк, все элементы которых имеют вхождения в список [0, 2]
, можно использовать метод DataFrame.all(axis=1)
:
>>> df.loc[df.isin([0, 2]).all(axis=1)] # num_legs num_wings # falcon 2 2
Чтобы посмотреть строки/столбцы DataFrame
, содержащие хотя бы одно значение из списке [0, 2]
, то необходимо использовать оператор отрицания ~
:
>>> ~df.isin([0, 2]) # num_legs num_wings # falcon False False # dog True False # используем логическую индексацию выведем # СТРОКИ, где есть НЕ СОВПАВШИЕ значения >>> df.loc[~df.isin([0, 2]).all(axis=1)] # num_legs num_wings # dog 4 0 # теперь СТОЛБЦЫ, где есть НЕ совпавшие значения >>> df.loc[:, ~df.isin([0, 2]).all()] # num_legs # falcon 2 # dog 4
Метод DataFrame.any()
можно использовать совместно с методом DataFrame.isna()
, для просмотра строк, содержащих хотя бы одно значение NA
>>> import numpy as np df = pd.DataFrame(dict(age=[5, 6, np.nan], born=[pd.NaT, pd.Timestamp('1939-05-27'), pd.Timestamp('1940-04-25')], name=['Alfred', 'Batman', ''], toy=[None, 'Batmobile', 'Joker'])) >>> df # age born name toy # 0 5.0 NaT Alfred None # 1 6.0 1939-05-27 Batman Batmobile # 2 NaN 1940-04-25 Joker # ячейки с `NA` будут `True` >>> df.isna() # age born name toy # 0 False True False True # 1 False False False False # 2 True False False False
Чтобы посмотреть строки DataFrame
, содержащие NA
можно использовать метод DataFrame.any()
:
>>> df.isna().any(axis=1) # 0 True # 1 False # 2 True # dtype: bool
Теперь, используя "логическую индексацию" выведем сами строки DataFrame
, содержащие NA
:
>>> df.loc[df.isna().any(axis=1)] # age born name toy # 0 5.0 NaT Alfred None # 2 NaN 1940-04-25 Joker
DataFrame.all(*, axis=0, bool_only=False, skipna=True, **kwargs)
:Series.all(*, bool_only=False, skipna=True, **kwargs)
:Методы DataFrame.all()
и Series.all()
возвращают True
, если ВСЕ элементы в Series
или вдоль оси DataFrame
имеют значение True
или эквивалентны (например, НЕ ноль или НЕ пустая строка).
Принимаемые аргументы:
axis=0
- какую ось или оси следует использовать. Для Series
не используется и по умолчанию равен 0.
Принимает значения:
‘index’
: возвращает Series
, индекс которой является исходными метками столбцов.‘columns’
: возвращает Series
, индекс которой является индексом строк.None
: работает по всем осям и возвращает скаляр.bool_only=False
- работает только со значением bool
(НЕ использует эквиваленты). Не реализовано для Series
.
skipna=True
- исключает из анализа значения NA
/null
. Если вся строка/столбец имеет значение NA
, а skipna=True
, то результат будет True
, как и для пустой строки/столбца. Если skipna=False
, то NA
рассматривается как True
, т.к. они не равны нулю.
**kwargs
- не имеют никакого эффекта, но могут быть приняты для совместимости с NumPy
.
Series.all()
:>>> import pandas as pd >>> pd.Series([True, True]).all() # True >>> pd.Series([True, False]).all() # False >>> pd.Series([], dtype="float64").all() # True >>> pd.Series([np.nan]).all() # True >>> pd.Series([np.nan]).all(skipna=False) # True
DataFrame.all()
:Для примеров используем следующий DataFrame
:
>>> df = pd.DataFrame({'col1': [True, True], 'col2': [True, False]}) >>> df # col1 col2 # 0 True True # 1 True False
Поведение по умолчанию проверяет, все ли значения в столбцах возвращают значение True
.
>>> df.all() # col1 True # col2 False # dtype: bool
Чтобы проверить, все ли значения в строках DataFrame
возвращают значение True
укажем аргумент axis='columns'
.
>>> df.all(axis='columns') # 0 True # 1 False # dtype: bool
Установка аргумента axis=None
проверяет каждое значение DataFrame
на истинность.
>>> df.all(axis=None) # False
DataFrame.any(*, axis=0, bool_only=False, skipna=True, **kwargs)
:Series.any(*, bool_only=False, skipna=True, **kwargs)
:Методы DataFrame.any()
и Series.any()
возвращают True
, если хотя бы ОДИН элемент в Series
или вдоль оси DataFrame
имеет значение True
или эквивалентны (например, НЕ ноль или НЕ пустая строка).
Принимаемые аргументы:
axis=0
- какую ось или оси следует использовать. Для Series
не используется и по умолчанию равен 0.
Принимает значения:
‘index’
: возвращает Series
, индекс которой является исходными метками столбцов.‘columns’
: возвращает Series
, индекс которой является индексом строк.None
: работает по всем осям и возвращает скаляр.bool_only=False
- работает только со значением bool
(НЕ использует эквиваленты). Не реализовано для Series
.
skipna=True
- исключает из анализа значения NA
/null
. Если вся строка/столбец имеет значение NA
, а skipna=True
, то результат будет True
, как и для пустой строки/столбца. Если skipna=False
, то NA
рассматривается как True
, т.к. они не равны нулю.
**kwargs
- не имеют никакого эффекта, но могут быть приняты для совместимости с NumPy
.
Series.any()
:>>> import pandas as pd >>> pd.Series([False, False]).any() # False >>> pd.Series([True, False]).any() # True >>> pd.Series([], dtype="float64").any() # False >>> pd.Series([np.nan]).any() # False >>> pd.Series([np.nan]).any(skipna=False) # True
DataFrame.any()
:Содержит ли каждый столбец хотя бы один элемент True (по умолчанию).
>>> df = pd.DataFrame({"A": [1, 2], "B": [0, 2], "C": [0, 0]}) >>> df # A B C # 0 1 0 0 # 1 2 2 0 >>> df.any() # A True # B True # C False # dtype: bool
Агрегирование по столбцам.
>>> df = pd.DataFrame({"A": [True, False], "B": [1, 2]}) >>> df # A B # 0 True 1 # 1 False 2 >>> df.any(axis='columns') # 0 True # 1 True # dtype: bool
Смотрим как метод DataFrame.any()
работает с эквивалентами логических значений (в данном случае 0)
>>> df = pd.DataFrame({"A": [True, False], "B": [1, 0]}) >>> df # A B # 0 True 1 # 1 False 0 # по умолчанию метод обрабатывает 0 как эквивалент `False` >>> df.any(axis='columns') # 0 True # 1 False # dtype: bool # установим `bool_only=True` >>> df.any(axis='columns', bool_only=True) # 0 True # 1 True # dtype: bool
Агрегирование по всему DataFrame
с axis=None
>>> df.any(axis=None) # True
Метод DataFrame.any()
для пустого DataFrame
является пустой Series
.
>>> pd.DataFrame([]).any() # Series([], dtype: bool)