Панды группового и короткого значения и взять топ-3 с рангом уникальным в питоне? - PullRequest
1 голос
/ 24 апреля 2019

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

          Val1     Val2 

     0     a        1.0
     1     a        1.0
     2     a        0.98
     3     a        0.78
     4     a        0.70
     5     b        0.97
     6     b        0.67
     7     b        0.75
     8     b        1.0

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

как это

      Val1    Val2

  0     a        1.0  ----------- top1 of a
  1     a        1.0  ----------- top1 of a
  2     a        0.98 ----------- top2 of a
  3     a        0.78  ------------ top3 of a
  5     b        0.97  
  7     b        0.75
  6     b        0.67

Итак, как вы можете видеть, если значение в поле одинаково, оно должно считать его только верхним 1-м.

Я пробовал это,

result_CI.sort_values(['Val2'],ascending=False).groupby('Val1').head(3)

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

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Вы можете сделать:

df[df.groupby('Val1')['Val2'].rank(method='dense',ascending=False)<=3]
#or df[df.groupby('Val1')['Val2'].apply(lambda x: x.rank(method='dense',ascending=False)<=3)]

  Val1  Val2
0    a  1.00
1    a  1.00
2    a  0.98
3    a  0.78
5    b  0.97
7    b  0.75
8    b  1.00
0 голосов
/ 30 апреля 2019

Уже ответили, но просто добавили еще один способ сделать это.

import pandas as pd
import numpy as np

c = ['Val1','Val2'] 
v = [
        ['b',1.0],
        ['a',1.0],
        ['a',1.0],
        ['a',0.98],
        ['a',0.78],
        ['a',0.70],
        ['b',0.97],
        ['b',0.67],
        ['b',0.75],

    ]


df = pd.DataFrame(v,columns=c)

##### Output ####
  Val1  Val2
0    b  1.00
1    a  1.00
2    a  1.00
3    a  0.98
4    a  0.78
5    a  0.70
6    b  0.97
7    b  0.67
8    b  0.75

k = df.groupby(['Val1']).apply(pd.DataFrame.sort_values, 'Val2',ascending=False)

print(k)

##### Output ####
       Val1  Val2
Val1             
a    1    a  1.00
     2    a  1.00
     3    a  0.98
     4    a  0.78
     5    a  0.70
b    0    b  1.00
     6    b  0.97
     8    b  0.75
     7    b  0.67
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...