Как подсчитать количество сотрудников по категориям зарплаты с помощью Pandas DataFrame
Что проверяют
Знаете ли вы идиоматичные средства pandas для биннинга вместо apply с цепочкой if. Смотрят на границы интервалов и на то, попадут ли в ответ пустые категории. Следом просят разбить по квантилям или посчитать то же в разрезе отдела.
Как отвечать
Правильный инструмент это pd.cut: он раскладывает числа по интервалам и возвращает категориальный тип с заданным порядком меток. Например, pd.cut(df["salary"], bins=[0, 40_000, 70_000, float("inf")], labels=["low", "medium", "high"], right=False), а затем value_counts(sort=False) по новой колонке.
Разберите детали:
- границы: по умолчанию
right=True, интервалы вида(40000, 70000], и зарплата ровно 40 000 уйдёт в «low». Сright=Falseвключается левый край. Значения за пределамиbinsстановятсяNaN, проверьте их черезisna().sum(); - порядок и пустые группы: у категориальной колонки
value_counts(sort=False)выдаёт категории в порядке меток, включая нулевые. Уgroupbyпо такой колонке передавайтеobservedявно, умолчание менялось между версиями pandas; - квантили:
pd.qcut(df["salary"], q=3)делит на равные по численности группы, это другая постановка, чем фиксированные пороги; - разрезы:
pd.crosstab(df["dept"], df["salary_cat"])илиgroupby(["dept", "salary_cat"], observed=False).size().unstack(fill_value=0); - доли:
value_counts(normalize=True)сразу даёт доли вместо штук.
np.select пригодится, когда условия не сводятся к порогам одной колонки, например учитывают грейд и город.
Где спотыкаются
Пишут функцию с if и apply. Работает, но построчно в Python: на миллионах строк это заметно медленнее векторизованного pd.cut, а границы легко задать с дырой.
Не проверяют граничные значения. Ровно 70 000 при разных right попадает в разные категории, и интервьюер спросит именно про эту строку.
Считают value_counts() без sort=False и получают сортировку по частоте, а не по смыслу. А при подсчёте по строковой колонке пустая категория просто исчезает из результата.