> Как посчитать количество уникальных значений в колонке 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()).
Пример кода
PYTHONimport pandas as pddf = pd.DataFrame({'user_id': [1, 2, 2, 3, 3, 3],'city': ['Moscow', 'SPb', 'Moscow', None, 'Kazan', 'Kazan']})# базовый подсчётprint(df['user_id'].nunique()) # 3# с учётом NaNprint(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())) # 2print(df['city'].value_counts().count()) # 2
Как отвечать на собеседовании
Начните с прямого ответа: nunique(). Затем упомяните параметр dropna - это показывает понимание нюансов. Добавьте, что для подсчёта уникальных комбинаций колонок используется drop_duplicates(). Если спросят про производительность, скажите, что nunique() реализован через хеш-таблицу, поэтому сложность O(n). Можно упомянуть, что для очень больших данных, не помещающихся в память, используется dask.dataframe или pyspark, где аналогичный метод называется approx_count_distinct (приблизительный подсчёт).
Что проверяет интервьюер
Интервьюер оценивает:
- знание стандартных методов pandas, а не изобретение велосипеда;
- понимание обработки пропущенных значений;
- умение выбирать подходящий инструмент под задачу (например,
nuniquevsvalue_counts); - осведомлённость о масштабировании на большие данные.
Типичные ошибки
- Забывают про
dropna=False, когдаNaN- значимое значение. - Используют
df['col'].unique().size- это работает, но менее читаемо и чуть медленнее. - Путают
nunique()сcount()- второй считает непустые значения, а не уникальные. - Применяют
nunique()к DataFrame без указания колонки, ожидая одно число, а получают Series. - Не учитывают, что
value_counts()по умолчанию тоже исключаетNaN, но при этом возвращает частоты, а не количество уникальных.
> Похожие задачи по mobile
Как реализовать поддержку кодирования и декодирования JSON без классов в Swift
Может ли dataCompanies быть nil при декодировании JSON в Swift?
Что такое дефолтный поток в Kotlin Coroutines?
В каких случаях использовать модификаторы in и out в дженериках Kotlin
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью