value_counts() в Pandas — частоты и распределения
Коротко
value_counts() — метод Series в pandas, который считает количество каждого уникального значения. Это первое, что аналитик вызывает для понимания распределения данных. По умолчанию сортирует по убыванию частоты. Поддерживает нормализацию (доли), группировку в бины, обработку NaN. На собеседованиях value_counts часто используется в задачах на EDA (exploratory data analysis).
Базовое использование
import pandas as pd
df = pd.DataFrame({
'city': ['Москва', 'Питер', 'Москва', 'Казань', 'Москва', 'Питер', 'Казань', 'Москва'],
'segment': ['premium', 'free', 'premium', 'free', 'free', 'premium', 'free', 'premium']
})
df['city'].value_counts()
# Москва 4
# Питер 2
# Казань 2
# Name: city, dtype: int64Результат — Series, где индекс — уникальные значения, значения — количество. Сортировка по убыванию частоты.
Параметры
normalize — доли вместо количества
df['city'].value_counts(normalize=True)
# Москва 0.500
# Питер 0.250
# Казань 0.250
# В процентах
(df['city'].value_counts(normalize=True) * 100).round(1)
# Москва 50.0
# Питер 25.0
# Казань 25.0sort — порядок сортировки
# По убыванию частоты (по умолчанию)
df['city'].value_counts(sort=True)
# По возрастанию частоты
df['city'].value_counts(ascending=True)
# По алфавиту (без сортировки по частоте)
df['city'].value_counts().sort_index()dropna — учёт пропусков
s = pd.Series(['A', 'B', 'A', None, 'B', None, 'A'])
s.value_counts() # NaN не считается (по умолчанию)
# A 3
# B 2
s.value_counts(dropna=False) # NaN учитывается
# A 3
# B 2
# NaN 2По умолчанию value_counts игнорирует пропуски. dropna=False включает их в подсчёт — полезно для оценки доли пропусков.
bins — группировка числовых данных
ages = pd.Series([22, 25, 31, 28, 45, 37, 19, 55, 42, 33])
ages.value_counts(bins=4)
# (18.964, 28.0] 4
# (37.0, 46.0] 2
# (28.0, 37.0] 2
# (46.0, 55.0] 2bins разбивает числовые значения на интервалы — быстрый способ построить гистограмму без matplotlib.
Практические примеры
Распределение пользователей по сегментам
df['segment'].value_counts()
# free 450
# premium 120
# trial 30
# Доли
df['segment'].value_counts(normalize=True).round(3)
# free 0.750
# premium 0.200
# trial 0.050Топ-10 городов
df['city'].value_counts().head(10).head(10) — первые 10 значений. Поскольку value_counts сортирует по убыванию, это топ-10 по частоте.
Распределение заказов по дням недели
df['order_date'] = pd.to_datetime(df['order_date'])
df['weekday'] = df['order_date'].dt.day_name()
df['weekday'].value_counts()
# Wednesday 156
# Thursday 148
# Tuesday 142
# Monday 138
# Friday 135
# Saturday 92
# Sunday 89Подсчёт по нескольким столбцам
# Кросс-табуляция двух столбцов
df.groupby(['city', 'segment']).size()
# Или через value_counts на DataFrame (pandas 1.1+)
df[['city', 'segment']].value_counts()
# city segment
# Москва premium 3
# free 1
# Питер premium 1
# free 1
# Казань free 2С pandas 1.1+ value_counts() работает на DataFrame — считает частоту комбинаций столбцов.
Фильтрация редких категорий
counts = df['category'].value_counts()
# Категории с менее чем 10 записями
rare = counts[counts < 10].index
df_filtered = df[~df['category'].isin(rare)]
# Или: оставить только топ-5 категорий
top5 = counts.head(5).index
df_top5 = df[df['category'].isin(top5)]Визуализация
import matplotlib.pyplot as plt
df['city'].value_counts().plot(kind='bar')
plt.title('Пользователи по городам')
plt.ylabel('Количество')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Горизонтальный bar chart
df['city'].value_counts().plot(kind='barh')
# Pie chart
df['segment'].value_counts().plot(kind='pie', autopct='%1.1f%%')value_counts vs groupby
| Задача | value_counts | groupby |
|---|---|---|
| Частота одного столбца | df['col'].value_counts() |
df.groupby('col').size() |
| С агрегацией | Нет | df.groupby('col').agg(...) |
| Нормализация | normalize=True |
Ручной .div(len(df)) |
| Бины | bins=N |
pd.cut() + groupby |
value_counts — шорткат для частотного анализа одного столбца. Для сложных агрегаций — groupby.
value_counts vs nunique vs unique
s = pd.Series(['A', 'B', 'A', 'C', 'B'])
s.value_counts() # Частота каждого значения
# A 2
# B 2
# C 1
s.nunique() # Количество уникальных → 3
s.unique() # Массив уникальных → array(['A', 'B', 'C'])value_counts()— частота каждого значенияnunique()— сколько уникальных значенийunique()— какие уникальные значения
Типичные ошибки
Вызов на DataFrame вместо Series. df.value_counts() работает с pandas 1.1+, но считает комбинации всех столбцов. Обычно нужен df['column'].value_counts().
Забывают про NaN. По умолчанию NaN не считается. Если нужно учесть пропуски — dropna=False.
Сортировка по индексу. value_counts сортирует по частоте. Для сортировки по значению (алфавит, даты) — .sort_index().
Вопросы с собеседований
-- Как быстро посмотреть распределение значений в столбце?
-- df['col'].value_counts() — частоты. С normalize=True — доли. .head(10) — топ-10.
-- Как найти самое частое значение?
-- df['col'].value_counts().index[0] или df['col'].mode()[0]. value_counts сортирует по убыванию, первый элемент — мода.
-- Как посчитать процент каждой категории?
-- df['col'].value_counts(normalize=True) * 100. Или df['col'].value_counts() / len(df) * 100.
-- Чем value_counts отличается от groupby + count? -- value_counts — шорткат для подсчёта частот одного столбца с сортировкой и нормализацией. groupby + count позволяет агрегировать несколько столбцов и применять разные функции.
Потренируйтесь решать задачи — откройте тренажёр с 1500+ вопросами для подготовки к собеседованиям аналитиков.
FAQ
Можно ли использовать value_counts для числовых столбцов?
Да, но для непрерывных данных (доход, возраст) лучше использовать bins для группировки. Без bins каждое уникальное число будет отдельной строкой — для 10000 уникальных значений это бесполезно.
Как сделать value_counts для нескольких столбцов?
df[['col1', 'col2']].value_counts() — частота комбинаций. Для отдельных столбцов: df[['col1', 'col2']].apply(pd.Series.value_counts) или цикл.
value_counts в SQL — аналог?
SELECT col, COUNT(*) FROM table GROUP BY col ORDER BY COUNT(*) DESC — точный аналог df['col'].value_counts().
Как тренироваться
value_counts — один из самых полезных методов pandas для EDA. Задачи на pandas и анализ данных — в тренажёре Карьерник. Больше вопросов — в разделе с примерами.