Как посчитать количество уникальных значений в колонке DataFrame?
Что проверяют
Базовое знание pandas и внимательность к деталям: чем отличаются nunique(), unique() и value_counts() и как каждый из них обходится с пропусками. Следом почти всегда просят посчитать уникальные значения по группам или сразу по нескольким колонкам.
Как отвечать
Короткий ответ: df["city"].nunique(). Дальше покажите, что знаете окрестности:
nunique(): возвращает число. По умолчаниюdropna=True, пропуски не считаются, для их учёта нуженnunique(dropna=False). На всём DataFramedf.nunique()вернёт Series с числом уникальных по каждой колонке;unique(): сами значения в порядке первого появления, без сортировки.NaNсюда попадает, поэтомуlen(df["city"].unique())может разойтись сnunique()на единицу;value_counts(): частоты каждого значения по убыванию. Тоже по умолчанию выбрасывает пропуски, аnormalize=Trueдаёт доли вместо штук;- по группам:
df.groupby("city")["user_id"].nunique(), классика вроде «сколько уникальных покупателей в каждом городе»; - по нескольким колонкам: уникальные комбинации считаются через
len(df.drop_duplicates(subset=["city", "segment"]))илиdf.value_counts(["city", "segment"]).
Если данных много, добавьте пару слов о производительности. Колонка с небольшим числом значений в типе category занимает меньше памяти и обрабатывается быстрее. В Polars тот же смысл у n_unique(). Когда данные не помещаются в память, точный подсчёт заменяют приближённым: в Spark есть approx_count_distinct на основе HyperLogLog, в ClickHouse приближённый uniq и точный uniqExact.
Где спотыкаются
Забывают про пропуски. Интервьюер спрашивает, почему nunique() вернул 5, а в unique() шесть элементов, и кандидат не может объяснить, что шестой это NaN.
Пишут len(set(df["col"])). Это работает, но медленнее, а с пропусками ведёт себя непредсказуемо: каждый NaN может посчитаться отдельным значением, потому что NaN не равен сам себе.
Путают count() с подсчётом уникальных. count() возвращает число непустых значений, а не число различных, и на колонке без пропусков просто совпадает с длиной.