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

Метод .value_counts() объектов DataFrame/Series в pandas

Количество повторов каждой отдельной строки (выбранных столбцов) DataFrame/Series

Содержание:

  • DataFrame.value_counts() - счетчик уникальных значений (количество дубликатов) каждой отдельной строки или выбранных столбцов/столбца;
  • Series.value_counts() - счетчики уникальных значений Series;

DataFrame.value_counts(subset=None, normalize=False, sort=True, ascending=False, dropna=True):

Метод DataFrame.value_counts() возвращает Series, содержащий счетчик уникальных значений (количество дубликатов) каждой отдельной строки или выбранных столбцов (аргумент subset) в DataFrame.

Принимаемые аргументы:

  • subset=None - столбцы, используемые при подсчете уникальных комбинаций;
  • normalize=False - возвращает относительную частоту уникальных значений, а не количество уникальных значений;
  • sort=True - сортирует по частоте, если True и по значениям столбцов DataFrame, если False;
  • ascending=False - сортировать в порядке возрастания;
  • dropna=True - не включать строки, содержащих значения NA.

Пример использования DataFrame.value_counts():

Возвращаемый Series будет иметь MultiIndex с одним уровнем для каждого входного столбца, но Index (не multi) для одной метки. По умолчанию строки, содержащие любые значения NA, в результате не учитываются. По умолчанию результирующий ряд будет располагаться в порядке убывания, так что первый элемент будет наиболее часто встречающейся строкой.

>>> import pandas as pd
>>> import numpy as np

df = pd.DataFrame({'num_legs': [2, 4, 4, 6],
                   'num_wings': [2, 0, 0, 0]},
                  index=['falcon', 'dog', 'cat', 'ant'])
>>> df
#         num_legs  num_wings
# falcon         2          2
# dog            4          0
# cat            4          0
# ant            6          0
# количество уникальных значений (по убыванию),
# которое встречается в обоих столбцах
>>> df.value_counts()
# num_legs  num_wings
# 4         0            2
# 2         2            1
# 6         0            1
# Name: count, dtype: int64

# сортируем по значениям столбцов, 
# а не по количеству уникальных значений 
>>> df.value_counts(sort=False)
# num_legs  num_wings
# 2         2            1
# 4         0            2
# 6         0            1
# Name: count, dtype: int64

# сортируем по количеству уникальных 
# значений - по возрастанию
>>> df.value_counts(ascending=True)
# num_legs  num_wings
# 2         2            1
# 6         0            1
# 4         0            2
# Name: count, dtype: int64

Относительная частота появлений уникальных значений:

>>> df.value_counts(normalize=True)
# num_legs  num_wings
# 4         0            0.50
# 2         2            0.25
# 6         0            0.25
# Name: proportion, dtype: float64

Вывод выше говорит о том, что сочетание уникальных значений столбцов num_legs и num_wings - 4 и 0 встречается в 50% случаев, 2 и 2 - в 25%, а также 6 и 0 тоже в 25% случаев.

С dropna=False, также можно подсчитывать строки со значениями NA. Для этого создадим новый DataFrame с пропущенными значениями.

>>> import pandas as pd
>>> import numpy as np

df = pd.DataFrame({'first_name': ['John', 'Anne', 'John', 'Beth'],
                   'middle_name': ['Smith', pd.NA, pd.NA, 'Louise']})
>>> df
#   first_name middle_name
# 0       John       Smith
# 1       Anne        <NA>
# 2       John        <NA>
# 3       Beth      Louise
# подсчет без учета пустых значений
>>> df.value_counts()
# first_name  middle_name
# Beth        Louise         1
# John        Smith          1
# Name: count, dtype: int64

# подсчет с учетом пустых значений
>>> df.value_counts(dropna=False)
# first_name  middle_name
# Anne        NaN            1
# Beth        Louise         1
# John        Smith          1
#             NaN            1
# Name: count, dtype: int64

Подсчет уникальных значений только в столбце 'first_name'

>>> df.value_counts("first_name")
# first_name
# John    2
# Anne    1
# Beth    1
# Name: count, dtype: int64

Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True):

Метод Series.value_counts() возвращает Series, содержащий счетчики уникальных значений.

Результирующий объект будет располагаться в порядке убывания, т.е. первый элемент будет наиболее часто встречающимся. По умолчанию значения NA исключаются.

Принимаемые аргументы:

  • normalize=False - возвращает относительную частоту уникальных значений, а не количество уникальных значений;
  • sort=True - сортирует по частоте, если True и по значениям столбцов DataFrame, если False;
  • ascending=False - сортировать в порядке возрастания;
  • bins=None - группирует значения Series по диапазонам, работает только с числовыми данными. Принимает значения int, которое означает, на какое количество диапазонов разделить значения Series. (Смотрите 3 пример, чтобы понять о чем речь)
  • dropna=True - не включать строки, содержащих значения NA.

Пример использования Series.value_counts():

>>> import pandas as pd
>>> import numpy as np
>>> index = pd.Index([3, 1, 2, 3, 4, np.nan])
>>> index.value_counts()
# 3.0    2
# 1.0    1
# 2.0    1
# 4.0    1
# Name: count, dtype: int64

Если аргумент normalize=True, возвращает относительную частоту появлений уникальных значений.

>>> s = pd.Series([3, 1, 2, 3, 4, np.nan])
>>> s.value_counts(normalize=True)
# 3.0    0.4
# 1.0    0.2
# 2.0    0.2
# 4.0    0.2
# Name: proportion, dtype: float64

Вывод выше говорит о том, что цифра 3 встречается в 40% случаев, цифра 1 - в 20%, цифра 2 - в 20% и цифра 4 тоже в 20% случаев.

Аргумент bins может быть полезен для перехода от непрерывной индексации к категориальной. Аргумент bins принимает целое число, которое означает количество необходимых диапазонов и подсчитывает уникальные появления значений в этих диапазонах.

# делим Series на 3 диапазона `bins=3`
>>> s.value_counts(bins=3)
# (0.996, 2.0]    2
# (2.0, 3.0]      2
# (3.0, 4.0]      1
# Name: count, dtype: int64

Вывод выше говорит о том, что в диапазоне 0.996 < х <= 2.0 встречается 2 значения, в диапазоне 2.0 < х <= 3.0 - 2 значения и в диапазоне 3.0 < х <= 4.0 - 1 значение Series.

Если dropna=False, также можно увидеть значения индекса NaN.

>>> s.value_counts(dropna=False)
# 3.0    2
# 1.0    1
# 2.0    1
# 4.0    1
# NaN    1
Name: count, dtype: int64