Вернуть N самых больших значений на группу, используя панд - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь найти максимальные значения в количестве серий, каждая из которых сгруппирована по имени столбца, из которого она была извлечена.

У меня есть такой фрейм данных:

MASTER      SLAVE       Value

Master_1    Slave_1     657879
Master_1    Slave_2     34343
Master_1    Slave_3     453313

Master_2    Slave_1     56667
Master_2    Slave_2     6879
Master_2    Slave_3     12333
Master_2    Slave_4     789
Master_2    Slave_5     22235

Master_3    Slave_1     65765
Master_3    Slave_2     23431
Master_3    Slave_3     445
Master_3    Slave_4     567

Мне нужночтобы найти максимальные значения первых двух ведомых устройств каждого мастера.

Это пока что я получил:

df.groupby('MASTER')['SLAVE'].unique()

Он выводит значения серии 'Slaves' для каждого 'MASTER':

Master_1    [657879, 34343, 453313]
Master_2    [56667, 6879, 12333, 789, 22235]
Master_3    [65765, 23431, 445, 789, 567]

Но я не понимаю, с каким типом данных я имею дело после этого ввода.И как я могу отсортировать эти значения.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

IIUC, один вариант: sort_values и GroupBy.head с n = 2:

df.sort_values('Value', ascending=False).groupby('MASTER', sort=False).head(2)

     MASTER    SLAVE   Value
0  Master_1  Slave_1  657879
2  Master_1  Slave_3  453313
8  Master_3  Slave_1   65765
3  Master_2  Slave_1   56667
9  Master_3  Slave_2   23431
7  Master_2  Slave_5   22235

Другой использует set_index и GroupBy.nlargest с n = 2:

df.set_index('SLAVE').groupby('MASTER')['Value'].nlargest(2).reset_index()

     MASTER    SLAVE   Value
0  Master_1  Slave_1  657879
1  Master_1  Slave_3  453313
2  Master_2  Slave_1   56667
3  Master_2  Slave_5   22235
4  Master_3  Slave_1   65765
5  Master_3  Slave_2   23431
0 голосов
/ 06 июня 2019

Вы можете использовать комбинацию sort и groupby:

df.sort_values(['MASTER', 'Value'], ascending=[True, False], inplace=True)
grp = df.groupby('MASTER')['SLAVE'].indices
slaves = {k: df.loc[k][:2]['SLAVE'].values  for k in grp.keys()}

Будет выводить:

{'Master_1': array(['Slave_1', 'Slave_3'], dtype=object),
 'Master_2': array(['Slave_1', 'Slave_5'], dtype=object),
 'Master_3': array(['Slave_1', 'Slave_2'], dtype=object)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...