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