#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