#python #python-3.x #pandas #dataframe #group-by
Вопрос:
У меня есть фрейм данных:
id type val a1 q 100 a1 v 4 a1 l 17 b1 p 1 b1 j 700 b1 s 3
Я хочу сгруппироваться по идентификатору с сохранением типа столбца и суммированием значений в столбце val. Значение в типе столбца должно иметь значение с наибольшим значением val. Поэтому желаемый результат должен быть:
id type val a1 q 121 b1 j 704
Тип для идентификатора a1-q, потому что у него был самый высокий вал (100), а b1-j, потому что у него был самый высокий вал (700). Как это сделать?
Комментарии:
1. В будущих вопросах, пожалуйста, включайте примеры данных в рабочий код, чтобы людям было легко взять ваш пример и дать ответ. Наличие его в тексте, конечно, лучше, чем изображение, но определение фрейма данных в коде помогает предоставить рабочий код в ответе, который будет отвечать вашим потребностям.
Ответ №1:
Вы можете попробовать это:
df.sort_values(by='val', ascending=False).groupby('id').agg({'type': 'first', 'val': 'sum'})
Это дает:
type val id a1 q 121 b1 j 704
Ответ №2:
df_max = df.groupby(['id']).agg({'val': 'max'})[['id', 'type']] df_sum = df.groupby(['id']).agg({'val': 'sum'}) df_sum.merge(df_max, on='id', how='left')
Ответ №3:
Похоже, это то, что тебе нужно:
import pandas as pd df = pd.DataFrame([ ['a1', 'q', 100], ['a1', 'v', 4], ['a1', 'l', 17], ['b1', 'p', 1], ['b1', 'j', 700], ['b1', 's', 3] ]) df.columns = ['id', 'type', 'val'] print(df.loc[df.groupby('id')['val'].idxmax()])
Результат:
id type val 0 a1 q 100 4 b1 j 700
Кстати, вы говорите «должно быть наибольшее значение», но в вашем желаемом выводе это на самом деле сумма этих значений.
Если сумма является желаемым результатом, это может удовлетворить ваши потребности:
result = df.loc[df.groupby('id')['val'].idxmax()] result.set_index('id', inplace=True) result['val'] = df.groupby('id')['val'].sum()
Результат:
type val id a1 q 121 b1 j 704
Обратите внимание, что имя val
столбца теперь может сбивать с толку, в зависимости от фактического приложения , поскольку оно больше не является val
, но на самом деле является sum(val)
или val_sum
и т. Д.
Комментарии:
1. он не суммировал значения в столбце val
2. Тип относится к соответствующему наибольшему значению, в то время
val
как столбец представляет собой сумму группыid
Ответ №4:
В вашем случае
out = df.set_index('type').groupby('id').val.agg(['sum','idxmax']).reset_index() id sum idxmax 0 a1 121 q 1 b1 704 j