DataFrame: получить n верхних значений каждого типа

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

У меня есть группа данных, подобная приведенной ниже

 ID  Type    value_1 value_2
1   A   12  89
2   A   13  78
3   A   11  92
4   A   9   79
5   B   15  83
6   B   34  91
7   B   2   87
8   B   3   86
9   B   7   85
10  C   9   83
11  C   3   85
12  C   2   87
13  C   12  88
14  C   11  82
  

Я хочу получить 3 верхних элемента каждого типа в соответствии с value_1 . Единственное решение, которое приходит мне в голову, заключается в следующем: сначала поместите данные каждого типа в dataframe и отсортируйте в соответствии с value_1 и получите верхние 3; Затем объедините результат вместе.
Но есть ли какой-нибудь простой способ решить эту проблему? Для удобства обсуждения у меня есть коды ниже

 #coding:utf-8
import pandas as pd
_data = [
    ["1","A",12,89],
    ["2","A",13,78],
    ["3","A",11,92],
    ["4","A",9,79],
    ["5","B",15,83],
    ["6","B",34,91],
    ["7","B",2,87],
    ["8","B",3,86],
    ["9","B",7,85],
    ["10","C",9,83],
    ["11","C",3,85],
    ["12","C",2,87],
    ["13","C",12,88],
    ["14","C",11,82]
]
head= ["ID","type","value_1","value_2"]
df = pd.DataFrame(_data, columns=head)
  

Ответ №1:

Затем мы используем groupby tail с sort_values

 newdf=df.sort_values(['type','value_1']).groupby('type').tail(3)
newer
    ID type  value_1  value_2
2    3    A       11       92
0    1    A       12       89
1    2    A       13       78
8    9    B        7       85
4    5    B       15       83
5    6    B       34       91
9   10    C        9       83
13  14    C       11       82
12  13    C       12       88
  

Ответ №2:

Конечно! DataFrame.groupby можно разделить фрейм данных на разные части с помощью групповых полей, а apply функция может применить UDF к каждой группе.

 df.groupby('type', as_index=False, group_keys=False)
    .apply(lambda x: x.sort_values('value_1', ascending=False).head(3))