对于a列中的相同值,请对b列中的值进行排序,然后选择前5个

时间:2019-09-10 09:26:04

标签: python pandas

我有一个包含两列col_1col_2的数据框。 col_2列中的值对应于col_1列中的值。

print (df)
   col_1  col_2
1      a     12
2      a     33
3      a     11
4      a      4
5      a     42
6      a     66
7      a      9
8      b     12
9      b     34
10     b     42
11     b     64
12     b     86
13     b      2

我想做的是,对于col_1 (a, b, c,..)中的每个值,我想对col_2中的相应值进行排序,并仅选择前5个值。新数据框应如下所示:

enter image description here

我尝试删除here所应用的重复项,因为col_2有时可能具有重复项。但是,它没有用。

df.sort_values('col_2', ascending=False).drop_duplicates('col_a').sort_index()

任何建议将不胜感激

2 个答案:

答案 0 :(得分:4)

改为使用drop_duplicates函数GroupBy.head,并以升序将第一列添加到DataFrame.sort_values

n = 5
df1 = df.sort_values(['col_1','col_2'], ascending=[True, False]).groupby('col_1').head(n)
print (df1)
   col_1  col_2
6      a     66
5      a     42
2      a     33
1      a     12
3      a     11
12     b     86
11     b     64
10     b     42
9      b     34
8      b     12

答案 1 :(得分:2)

使用GroupBy.Series.nlargest

df.groupby('col_1')['col_2'].nlargest(5)

输出

col_1    
a      5     66
       4     42
       1     33
       0     12
       2     11
b      11    86
       10    64
       9     42
       8     34
       7     12

要获取正确的索引,请使用reset_index

df.groupby('col_1')['col_2'].nlargest(5).reset_index(level=0).reset_index(drop=True)

输出

  col_1  col_2
0     a     66
1     a     42
2     a     33
3     a     12
4     a     11
5     b     86
6     b     64
7     b     42
8     b     34
9     b     12