idxmax() / idxmin() — индекс максимума и минимума

idxmax возвращает метку индекса первого максимального значения, idxmin — минимального. В отличие от max(), который отдаёт само значение, эти методы дают позицию-метку, по которой можно вытащить всю строку через .loc. Главный сценарий у аналитика — найти строку-лидера в каждой группе: df.loc[df.groupby(...)[col].idxmax()].

Синтаксис

s.idxmax(skipna=True) / df.idxmax(axis=0)

Примеры использования

Пример 1: Метка максимума и минимума

s = pd.Series([10, 40, 25], index=['a', 'b', 'c'])
s.idxmax(), s.idxmin()

Результат:

('b', 'a')

Пример 2: Строка с максимумом внутри каждой группы

df = pd.DataFrame({'user_id': [1, 1, 2],
                   'order_id': [11, 12, 13],
                   'amount': [100, 300, 50]})
df.loc[df.groupby('user_id')['amount'].idxmax()]

Результат:

   user_id  order_id  amount
1        1        12     300
2        2        13      50
Порешать Python-задачи в тренажёре →

Типичная ошибка

idxmax возвращает МЕТКУ индекса, а не позицию — для позиционного номера нужен np.argmax или .values.argmax(). При нескольких равных максимумах берётся первая встретившаяся метка. Если Series целиком NaN или пуста, метод бросает ValueError; для DataFrame по умолчанию axis=0 (максимум по каждой колонке).

Где спрашивают на собеседовании

Выбор рекордной строки: топ-заказ пользователя, день пиковой выручки, канал с максимальной конверсией. Постоянно всплывает в паре с groupby, когда нужно не агрегат, а именно строка-лидер.

FAQ: частые вопросы про idxmax/idxmin

Чем idxmax отличается от max?

max возвращает само максимальное значение, а idxmax — метку индекса, где этот максимум находится. Через idxmax + .loc можно достать всю строку с рекордом, а не только число. Для минимума аналогично работают min и idxmin.

Как достать целиком строку с максимумом по группам?

Сгруппируй, возьми idxmax по нужной колонке и подставь метки в .loc: df.loc[df.groupby('user_id')['amount'].idxmax()]. groupby(...).idxmax() вернёт по одной метке-лидеру на группу, а .loc вытащит соответствующие полные строки. Это стандартный приём вместо оконных функций.

Почему idxmax падает с ошибкой?

ValueError возникает, когда в Series нет ни одного валидного значения — вся колонка NaN или она пустая (при skipna=True пропуски отбрасываются, и не остаётся ничего). Отфильтруй или заполни пропуски перед вызовом, либо проверь, что группа не пустая. На DataFrame учитывай, что по умолчанию считается по столбцам (axis=0).

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas groupby · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →