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.0

sort — порядок сортировки

# По убыванию частоты (по умолчанию)
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]      2

bins разбивает числовые значения на интервалы — быстрый способ построить гистограмму без 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 и анализ данных — в тренажёре Карьерник. Больше вопросов — в разделе с примерами.