Сообщить об ошибке.

Методы .all() и .any() объектов Series/DataFrame в pandas

Методы .all() и .any() объектов Series/DataFrame в pandas работают аналогично одноименным функциям Python. В материале даны пояснения: как и где использовать эти методы на практике при анализе данных.

Содержание:


Как и где использовать на практике методы .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.

    Принимает значения:

    • 0 или ‘index’: возвращает Series, индекс которой является исходными метками столбцов.
    • 1 или ‘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.

    Принимает значения:

    • 0 или ‘index’: возвращает Series, индекс которой является исходными метками столбцов.
    • 1 или ‘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)