> Как посчитать количество уникальных значений в колонке DataFrame? (Python)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Сбер

Стек: Python

> Пример ответа

Короткий ответ

В pandas для подсчёта уникальных значений в колонке DataFrame используется метод nunique(). Он возвращает количество уникальных элементов, исключая NaN по умолчанию. Если нужно включить пропуски, передайте dropna=False. Альтернатива - df['col'].value_counts().count() или len(df['col'].unique()), но nunique() - самый идиоматичный и производительный вариант.

Подробное объяснение

Метод nunique() работает на объекте Series (колонке) и возвращает целое число. Он использует хеширование под капотом, поэтому эффективен даже на больших данных. Ключевой параметр - dropna, который по умолчанию равен True. Это значит, что NaN не учитывается. Если в данных пропуски значимы (например, кодируют отсутствие значения как отдельную категорию), нужно явно указать dropna=False.

Также nunique() можно применить ко всему DataFrame - тогда он вернёт количество уникальных значений для каждой колонки. Это удобно для быстрого профилирования данных. Для подсчёта уникальных комбинаций нескольких колонок используется df.drop_duplicates().shape[0] или df.groupby(['col1', 'col2']).ngroups.

На практике

В реальных задачах nunique() часто используется для:

  • проверки качества данных (например, сколько разных пользователей в логе);
  • оценки кардинальности категориальных признаков перед one-hot encoding;
  • сравнения распределений в train/test выборках.

Для больших DataFrame (миллионы строк) nunique() работает быстро, но если нужно ещё и частоты, лучше использовать value_counts(), который возвращает Series с количеством вхождений каждого значения. Тогда число уникальных - это len(value_counts()).

Пример кода

PYTHON
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 2, 3, 3, 3],
'city': ['Moscow', 'SPb', 'Moscow', None, 'Kazan', 'Kazan']
})
# базовый подсчёт
print(df['user_id'].nunique()) # 3
# с учётом NaN
print(df['city'].nunique()) # 2 (Moscow, SPb, Kazan - NaN исключён)
print(df['city'].nunique(dropna=False)) # 3 (NaN считается)
# для всех колонок сразу
print(df.nunique())
# user_id 3
# city 2
# альтернативные способы
print(len(df['city'].unique())) # 2
print(df['city'].value_counts().count()) # 2

Как отвечать на собеседовании

Начните с прямого ответа: nunique(). Затем упомяните параметр dropna - это показывает понимание нюансов. Добавьте, что для подсчёта уникальных комбинаций колонок используется drop_duplicates(). Если спросят про производительность, скажите, что nunique() реализован через хеш-таблицу, поэтому сложность O(n). Можно упомянуть, что для очень больших данных, не помещающихся в память, используется dask.dataframe или pyspark, где аналогичный метод называется approx_count_distinct (приблизительный подсчёт).

Что проверяет интервьюер

Интервьюер оценивает:

  • знание стандартных методов pandas, а не изобретение велосипеда;
  • понимание обработки пропущенных значений;
  • умение выбирать подходящий инструмент под задачу (например, nunique vs value_counts);
  • осведомлённость о масштабировании на большие данные.

Типичные ошибки

  • Забывают про dropna=False, когда NaN - значимое значение.
  • Используют df['col'].unique().size - это работает, но менее читаемо и чуть медленнее.
  • Путают nunique() с count() - второй считает непустые значения, а не уникальные.
  • Применяют nunique() к DataFrame без указания колонки, ожидая одно число, а получают Series.
  • Не учитывают, что value_counts() по умолчанию тоже исключает NaN, но при этом возвращает частоты, а не количество уникальных.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью