DataFrame:获取每种类型的前n个值

时间:2019-03-20 03:29:51

标签: 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

我想根据value_1获得每种类型的前3名成员。我想到的唯一解决方案是:首先,将每个Type数据放入一个数据帧中,并根据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)

2 个答案:

答案 0 :(得分:2)

然后我们将groupby tailsort_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

答案 1 :(得分:1)

当然! 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))