Как заменить значение при группировке на конкретное значение?

#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