Как посчитать количество ненулевых элементов в столбце
Что проверяют
Замечаете ли вы двусмысленность в самой формулировке: «ненулевые» может означать «непустые» (не NaN и не NULL) или «не равные нулю». Следом обычно спрашивают, как посчитать то же самое для всех столбцов сразу или на большой таблице в SQL и Spark.
Как отвечать
Сначала уточните, что считаем, и покажите оба варианта.
В pandas и рядом с ним:
- непустые значения:
df["col"].count()илиdf["col"].notna().sum(). Для всех столбцов сразуdf.count(), быстрый обзор даётdf.info(); - не равные нулю:
(df["col"] != 0).sum()корректен только без пропусков, потому чтоNaN != 0даётTrue. Надёжнее(df["col"].ne(0) & df["col"].notna()).sum(); - NumPy:
np.count_nonzero(arr)считает ненулевые, ноNaNтоже засчитает как ненулевое; - разреженные матрицы: у
scipy.sparseесть методcount_nonzero(), а атрибутnnzсчитает хранимые значения, включая явно записанные нули.
В SQL COUNT(col) пропускает NULL, а COUNT(*) считает все строки. Непустые и ненулевые одним выражением: COUNT(NULLIF(col, 0)). В PostgreSQL удобен COUNT(*) FILTER (WHERE col <> 0), переносимый вариант SUM(CASE WHEN col <> 0 THEN 1 ELSE 0 END).
В PySpark F.count("col") тоже пропускает null, но NaN в числовой колонке для Spark обычное значение, его отсекают отдельно через F.isnan.
Где спотыкаются
Не уточняют задачу и молча считают что-то одно. На собеседовании сам вопрос «пустые или нули?» часто ценится выше кода.
Путают count() с size и len(): последние возвращают число строк вместе с пропусками.
Забывают о «грязных» пропусках: пустая строка, строка "None" или -999 из выгрузки не считаются NaN, и count() их засчитает. Перед подсчётом такие значения нужно привести к NaN, например через replace.