s = pd.Series([10, 40, 25], index=['a', 'b', 'c'])
s.idxmax(), s.idxmin()
Результат:
('b', 'a')
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-задачи в тренажёре →
Выбор рекордной строки: топ-заказ пользователя, день пиковой выручки, канал с максимальной конверсией. Постоянно всплывает в паре с groupby, когда нужно не агрегат, а именно строка-лидер.
max возвращает само максимальное значение, а idxmax — метку индекса, где этот максимум находится. Через idxmax + .loc можно достать всю строку с рекордом, а не только число. Для минимума аналогично работают min и idxmin.
Сгруппируй, возьми idxmax по нужной колонке и подставь метки в .loc: df.loc[df.groupby('user_id')['amount'].idxmax()]. groupby(...).idxmax() вернёт по одной метке-лидеру на группу, а .loc вытащит соответствующие полные строки. Это стандартный приём вместо оконных функций.
ValueError возникает, когда в Series нет ни одного валидного значения — вся колонка NaN или она пустая (при skipna=True пропуски отбрасываются, и не остаётся ничего). Отфильтруй или заполни пропуски перед вызовом, либо проверь, что группа не пустая. На DataFrame учитывай, что по умолчанию считается по столбцам (axis=0).
Pandas groupby · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →