我有一个包含两列col_1
和col_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个值。新数据框应如下所示:
我尝试删除here所应用的重复项,因为col_2
有时可能具有重复项。但是,它没有用。
df.sort_values('col_2', ascending=False).drop_duplicates('col_a').sort_index()
任何建议将不胜感激
答案 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)
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