Сводная таблица панд, выбирающая строки с максимальными значениями - PullRequest
0 голосов
/ 21 мая 2018

У меня есть pandas dataframe как:

df

Id      Name        CaseId       Value 
82      A1          case1.01     37.71 
1558    A3          case1.01     27.71 
82      A1          case1.06     29.54 
1558    A3          case1.06     29.54 
82      A1          case1.11     12.09 
1558    A3          case1.11     32.09 
82      A1          case1.16     33.35 
1558    A3          case1.16     33.35 

Для каждой пары Id, Name мне нужно выбрать CaseId с максимальным значением.

т.е. я ищу следующий вывод:

Id      Name        CaseId       Value 
82      A1          case1.01     37.71
1558    A3          case1.16     33.35

Я попробовал следующее:

import pandas as pd
pd.pivot_table(df, index=['Id', 'Name'], columns=['CaseId'], values=['Value'], aggfunc=[np.max])['amax']

Но все, что он делает, это для каждого CaseId как столбца, он дает максимальное значение, а не результаты, которые я ищу выше.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Еще одна идея - создать объединенный столбец, взять его максимум, а затем разделить его на два столбца:

df['ValueCase'] = list(zip(df['Value'], df['CaseId']))
p = pd.pivot_table(df, index=['Id', 'Name'], values=['ValueCase'], aggfunc='max')
p['Value'], p['CaseId'] = list(zip(*p['ValueCase']))
del p['ValueCase']

Результат:

             CaseId  Value
Id   Name                 
82   A1    case1.01  37.71
1558 A3    case1.16  33.35
0 голосов
/ 21 мая 2018

sort_values + drop_duplicates

df.sort_values('Value').drop_duplicates(['Id'],keep='last')
Out[93]: 
     Id Name    CaseId  Value
7  1558   A3  case1.16  33.35
0    82   A1  case1.01  37.71

Поскольку мы публикуем в одно и то же время, добавим еще метод

df.sort_values('Value').groupby('Id').tail(1)
Out[98]: 
     Id Name    CaseId  Value
7  1558   A3  case1.16  33.35
0    82   A1  case1.01  37.71
0 голосов
/ 21 мая 2018

С nlargest и groupby

pd.concat(d.nlargest(1, ['Value']) for _, d in df.groupby('Name'))

     Id Name    CaseId  Value
0    82   A1  case1.01  37.71
7  1558   A3  case1.16  33.35
0 голосов
/ 21 мая 2018

Это должно работать:

df = df.sort_values('Value', ascending=False).drop_duplicates('Id').sort_index()

Вывод:

     Id Name    CaseId  Value
0    82   A1  case1.01  37.71
7  1558   A3  case1.16  33.35
...