Поиск названия максимального значения для каждой категории

#python #pandas #jupyter-notebook

Вопрос:

У меня есть объект groupby, который показывает общую цену с учетом бренда и состояния различных марок автомобилей:

 grouped_a = cars_data.groupby(['brand','state']) 
grouped_a['price'].sum()
 

какую функцию я могу использовать, чтобы вернуть бренд, связанный с самой высокой общей ценой в каждом штате? Я пробовал зацикливаться на объекте groupby, но это не работает.

Комментарии:

1. Что grouped_a['price'].idxmax() возвращается?

2. он возвращает состояние и марку самой высокой цены всего набора данных, а не самую высокую общую цену в каждом штате.

3. Он должен возвращать индексы максимальных строк @Cdf, см. Мой ответ.

Ответ №1:

Вы можете сгруппироваться, чтобы получить максимальное общее количество для каждого штата для каждого бренда, а затем объединить, чтобы найти бренд(ы) с наибольшим общим количеством. Обратите внимание, что у вас может быть несколько брендов с одинаковым общим количеством. Вот один из способов сделать это:

 row1list = ['Ford', 'California', 100]
row2list = ['Toyota', 'California', 200]
row3list = ['Toyota', 'California', 300]
cars_data = pd.DataFrame([row1list, row2list, row3list], columns=['brand', 'state', 'price'])

df_total_by_br_st = cars_data.groupby(['brand', 'state'], as_index=False).agg({'price': sum})
df_max_by_st = df_total_by_br_st.groupby('state', as_index=False).agg({'price': max})

df_max_by_st = df_max_by_st.rename(columns={'price': 'max_price'})

df_total_by_br_st = df_total_by_br_st.merge(df_max_by_st, on='state', how='left')
df_max_brand_by_state = df_total_by_br_st[df_total_by_br_st['price'] == df_total_by_br_st['max_price']]

print(df_max_brand_by_state)
#    brand       state  price  max_price
# 1  Toyota  California    500        500


 

Ответ №2:

idxmax() предоставляет вам индексы строк с максимальными значениями.

 >>> cars_data
   price      state brand
0     10  emergency    on
1     20  emergency   ing
2     15     trance    on
3     12     trance   ing
>>> max_price_rows = cars_data.groupby(['state'])['price'].idxmax()
>>> max_price_rows
state
emergency    1
trance       2
Name: price, dtype: int64
 

Итак, строки 1 и 2, т. е. с ценами 20 и 15 .

Если вам нужно максимальное значение для каждого состояния, передайте этот результат в .loc[] :

 >>> cars_data.loc[max_price_rows]
   price      state brand
1     20  emergency   ing
2     15     trance    on