В этом руководстве вы узнаете, как использовать метод .value_counts() в Pandas для подсчёта значений в вашем DataFrame и создания таблиц частот. Умение подсчитывать значения в наборе данных — важный шаг к лучшему пониманию распределения ваших данных. Метод .value_counts() содержит множество полезных параметров, которые позволяют тонко настраивать анализ.
К концу этого урока вы научитесь:
Использовать метод .value_counts() в Pandas
Создавать таблицы абсолютных и относительных частот
Обрабатывать пропущенные данные
Упрощать группировку (биннинг) значений в столбце
Комбинировать .value_counts() с методом .groupby(), чтобы исследовать частоты по разным группам
Содержание
Обзор метода .value_counts() в Pandas
Метод .value_counts() можно применять как к отдельному столбцу DataFrame, так и ко всему DataFrame целиком. Поведение метода немного отличается в зависимости от контекста применения, но в большинстве случаев он работает одинаково. Если будут различия, они будут указаны отдельно.
Давайте посмотрим на сигнатуру метода и его параметры по умолчанию:
# Метод value_counts() в Pandas
# Метод Series.value_counts() возвращает Series, содержащую количество уникальных значений.
# Результатом будет объект в убывающем порядке, чтобы первый элемент был наиболее часто встречающимся элементом.
# Исключает значения NA по умолчанию.
.value_counts(
normalize=False, # Будет ли возвращать относительные частоты (True) вместо абсолютных количеств (False).
# Если True, то все значения будут в диапазоне [0, 1].
sort=True, # Сортировать ли результат по частотам. По умолчанию True.
ascending=False, # Сортировать ли по возрастанию (True) или по убыванию (False) частот. По умолчанию False (убывание).
bins=None, # Если указано, значения будут сгруппированы в полуоткрытые бины (интервалы).
# Работает только для числовых данных.
dropna=True # Обработка пропущенных значений (NaN/None).
# Если True (по умолчанию), NaN будут исключены из подсчета.
# Если False, NaN будут включены в подсчет как отдельная категория.
)
Метод .value_counts() имеет только необязательные параметры, что означает, что если вы просто хотите подсчитать частоты значений, вы можете применить метод напрямую, без необходимости передавать какие-либо аргументы.
Загрузка примера DataFrame
Чтобы следовать данному руководству, загрузите приведённый ниже набор данных, скопировав и вставив предоставленный код. Если у вас есть собственные данные, вы можете использовать их — разумеется, ваши результаты будут отличаться.
# Загрузка примера Pandas DataFrame
import pandas as pd
# Загрузка CSV-файла с данными о студентах по указанному URL
df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
print(df.head())
# Возвращает:
# Grade Class Type Students
# 0 10 Beginner 35
# 1 11 Intermediate 20
# 2 10 Beginner 15
# 3 12 Advanced 15
# 4 9 Intermediate 30
Набор данных содержит всего три столбца, два из которых можно считать категориальными. Данные охватывают различные оценки (grades), типы классов и количество студентов в каждой группе.
Создание таблицы частот в Pandas с помощью .value_counts()
В этом разделе вы узнаете, как применять метод .value_counts() к столбцу DataFrame в Pandas. Например, если вы хотите подсчитать, сколько раз каждое уникальное значение встречается в столбце Students, вы можете просто применить этот метод к данному столбцу.
Давайте посмотрим, как это выглядит без передачи дополнительных аргументов — они будут рассмотрены позже в этом руководстве.
Метод возвращает объект Series, содержащий все уникальные значения и их количество. Поскольку результат является Series, вы можете легко получить доступ к данным с помощью индексации. Например, если вы хотите узнать, сколько раз встречается значение 20 (то есть, сколько классов содержат 20 студентов), вы можете обратиться к индексу [20]:
# Доступ к счетчикам одной категории
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Получение количества вхождений значения '20' из Series, возвращаемой value_counts()
print(df['Students'].value_counts()[20])
# Возвращает: 32
В следующем разделе вы узнаете, как сортировать таблицу частот в Pandas.
Сортировка таблицы частот в Pandas
Сортировка таблицы частот, созданной с помощью метода .value_counts(), управляется двумя параметрами:
sort= — определяет, нужно ли сортировать данные (по умолчанию True).
ascending= — указывает порядок сортировки: по возрастанию (True) или по убыванию (False).
По умолчанию Pandas сортирует значения по убыванию (то есть самые частые значения отображаются первыми).
Мы можем изменить это поведение и выполнить сортировку по возрастанию, установив параметр ascending=True. Это может быть полезно, если вы хотите увидеть наименее часто встречающиеся значения в наборе данных.
# Сортировка подсчитанных значений в порядке возрастания
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Вычисление таблицы частот для столбца 'Students' и сортировка результатов по возрастанию частоты
print(df['Students'].value_counts(ascending=True))
# Возвращает:
# 40 7
# 35 10
# 15 12
# 25 16
# 30 23
# 20 32
# Name: Students, dtype: int64
В этом случае наименее часто встречающиеся значения находятся выше в возвращаемой Series.
Отключив сортировку полностью (установив sort=False), данные будут отображаться в том порядке, в котором Pandas встречает их в наборе данных.
Сортировка таблицы частот по индексу (меткам)
В предыдущем разделе вы узнали, что метод .value_counts() возвращает объект Series, который может быть отсортирован или оставлен без изменений. Однако бывают случаи, когда вместо сортировки по частоте значений вы хотите отсортировать данные по их меткам (то есть по категориям).
Это можно сделать, добавив к результату метод .sort_index(). Данные можно отсортировать по возрастанию или убыванию, используя параметр ascending=.
Давайте отсортируем нашу таблицу частот по категориям в алфавитном порядке:
# Сортировка таблицы частот по ее индексу
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Вычисление таблицы частот для столбца 'Students'
# и затем сортировка полученного Series по индексу (значениям количества студентов) по возрастанию
print(df['Students'].value_counts().sort_index(ascending=True))
# Возвращает:
# 15 12
# 20 32
# 25 16
# 30 23
# 35 10
# 40 7
# Name: Students, dtype: int64
В следующем разделе вы узнаете, как рассчитать таблицу частот в Pandas, где вместо абсолютных значений будут использоваться нормализованные проценты.
Расчёт таблицы частот в Pandas с использованием процентов
Библиотека Pandas позволяет очень легко отображать частоты в процентах. Это делает данные проще для понимания, особенно при анализе распределения. Чтобы преобразовать подсчитанные значения в доли (проценты), можно использовать параметр normalize=.
По умолчанию этот параметр установлен в значение False. Если изменить его на True, значения будут представлены в виде долей от общей суммы (в диапазоне от 0 до 1):
# Отображение процентов для подсчитанных значений
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Вычисление таблицы частот для столбца 'Students'
# и отображение относительных частот (процентов) вместо абсолютных количеств
print(df['Students'].value_counts(normalize=True))
# Возвращает:
# 20 0.32
# 30 0.23
# 25 0.16
# 15 0.12
# 35 0.10
# 40 0.07
# Name: Students, dtype: float64
Имейте в виду, что по умолчанию Pandas сортирует значения по убыванию. Нормализация данных позволяет легко понять, какую долю от всего набора данных представляет каждая категория.
Группировка (биннинг) данных в таблицах частот Pandas
Метод .value_counts() также позволяет разбивать числовые данные на группы (бины) равного размера. Это удобная обёртка над методом .cut() из Pandas и позволяет подсчитать количество значений в каждой группе.
Давайте разделим данные на четыре числовые группы, воспользовавшись параметром bins=:
# Разбиение данных на интервалы (биннинг) с помощью Pandas value_counts
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Вычисление таблицы частот для столбца 'Students' с разбиением на 4 равных интервала (бина)
print(df['Students'].value_counts(bins=4))
# Возвращает:
# (14.974, 21.25] 44
# (27.5, 33.75] 23
# (33.75, 40.0] 17
# (21.25, 27.5] 16
# Name: Students, dtype: int64
Работа с пропущенными значениями в таблицах частот Pandas
В этом разделе вы узнаете, как обрабатывать пропущенные данные при использовании метода .value_counts(). Чтобы подробнее рассмотреть этот вопрос, давайте добавим в наш DataFrame некоторые пропущенные значения (NaN).
# Вставка пропущенных значений в DataFrame
# Предполагается, что DataFrame 'df' уже загружен
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# Присвоение значений None (пропущенных значений) столбцу 'Students' для строк с индексами от 0 до 10 включительно
df.loc[:10, 'Students'] = None
print(df.head())
# Возвращает:
# Grade Class Type Students
# 0 10 Beginner NaN
# 1 11 Intermediate NaN
# 2 10 Beginner NaN
# 3 12 Advanced NaN
# 4 9 Intermediate NaN
Теперь, когда в нашем DataFrame появились пропущенные значения (NaN), применим метод .value_counts() с параметрами по умолчанию и посмотрим, как будут выглядеть результаты:
# Просмотр подсчитанных значений
# Предполагается, что DataFrame 'df' уже загружен и содержит пропущенные значения
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# df.loc[:10, 'Students'] = None
print(df['Students'].value_counts())
# Возвращает:
# 20.0 27
# 30.0 21
# 25.0 16
# 15.0 10
# 35.0 8
# 40.0 7
# Name: Students, dtype: int64
По умолчанию метод исключает все пропущенные значения (NaN) из результата. Однако зачастую бывает полезно включить эти значения в анализ. Это можно сделать, передав dropna=True в параметрах метода .value_counts().
# Включение пропущенных значений в метод value_counts
# Предполагается, что DataFrame 'df' уже загружен и содержит пропущенные значения
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# df.loc[:10, 'Students'] = None
print(df['Students'].value_counts(dropna=False))
# Возвращает:
# 20.0 27
# 30.0 21
# 25.0 16
# NaN 11 # <- Теперь NaN включены в подсчет
# 15.0 10
# 35.0 8
# 40.0 7
# Name: Students, dtype: int64
Расчёт таблицы частот для нескольких столбцов с помощью .value_counts()
Метод .value_counts() также можно применять к нескольким столбцам одновременно. Преимущество применения метода ко всему DataFrame заключается в том, что становится доступен параметр subset=. Он позволяет передать список столбцов, по которым будет рассчитана комбинация уникальных значений и их частота.
Давайте посмотрим, как распределены значения по столбцам Grade и Class Type:
# Применение .value_counts() к нескольким столбцам
# Предполагается, что DataFrame 'df' уже загружен и содержит пропущенные значения
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# df.loc[:10, 'Students'] = None
print(df.value_counts(subset=['Class Type', 'Grade']))
# Возвращает:
# Class Type Grade
# Beginner 11 14
# Advanced 10 11
# Intermediate 10 10
# 12 10
# 9 9
# Advanced 9 7
# 11 7
# Beginner 10 7
# Intermediate 11 7
# Advanced 12 6
# Beginner 9 6
# 12 6
# dtype: int64
Сейчас результат возвращается в виде довольно неупорядоченного объекта Series. Вы можете улучшить восприятие данных, отсортировав индекс, чтобы лучше понимать иерархию комбинаций значений.
# Сортировка индекса после применения .value_counts к DataFrame
# Предполагается, что DataFrame 'df' уже загружен и содержит пропущенные значения
# import pandas as pd
# df = pd.read_csv('https://raw.githubusercontent.com/datagy/data/main/students.csv')
# df.loc[:10, 'Students'] = None
# Вычисление таблицы частот для комбинаций 'Class Type' и 'Grade'
# и затем сортировка полученного Series по его мультииндексу (по умолчанию по возрастанию)
print(df.value_counts(subset=['Class Type', 'Grade']).sort_index())
# Возвращает:
# Class Type Grade
# Advanced 9 7
# 10 11
# 11 7
# 12 6
# Beginner 9 6
# 10 7
# 11 14
# 12 6
# Intermediate 9 9
# 10 10
# 11 7
# 12 10
# dtype: int64
Упражнения
Пришло время проверить, насколько хорошо вы усвоили материал! Попробуйте выполнить приведённые ниже упражнения. Для их решения используйте предоставленный ниже DataFrame:
Метод .idxmax() возвращает индекс максимального значения в Series или DataFrame. Чтобы найти оценку (Grade), которая встречается чаще всего , можно использовать метод .value_counts() совместно с .idxmax()
В этом руководстве вы узнали, как использовать метод .value_counts() в Pandas для создания таблиц частот, подсчитывающих количество значений в Series или DataFrame. Ниже приведены основные моменты, которые вы изучили:
Метод .value_counts() можно применять как к Series (столбцу), так и ко всему DataFrame.
Он подсчитывает, сколько раз каждое значение встречается в данных.
С помощью параметра normalize=True можно получить относительные частоты (в долях от общего числа).
Метод можно использовать для нескольких столбцов одновременно, чтобы исследовать комбинации значений и их частоты.
Этот инструмент особенно полезен на этапе анализа данных, когда важно понимать распределение категорий или числовых значений.