python-3.x - Pandas groupby 和 short 值并在 python 中排名前 3 位?
问题描述
我有这样的数据框
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
我想在 Val1 上进行 groupby 并按降序排列 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
因此,您可以看到 field 中的值是否相同,它应该仅将其视为第一名。
我试过这个,
result_CI.sort_values(['Val2'],ascending=False).groupby('Val1').head(3)
但它并没有给出预期,因为我知道 head 只是从顶部取 3 个值。我也试过 nlargest 也没有给我预期的结果。
解决方案
你可以做:
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
推荐阅读
- c - readText 函数未将标准输入正确存储在动态缓冲区中
- visual-studio - 适用于 Blazor 组件的 Visual Studio Intellisense 自动完成功能
- python - 如何使用回调来更改多个 tkinter 检查按钮
- javascript - 添加或删除动态相关选择框
- flutter - 未处理的异常:查找已停用小部件的祖先是 audioplayers 包的不安全错误
- python - 如何让 tkinter 中的列根据列中最小的小部件而不是跨越两列的小部件来设置它们的大小?
- c - 在父 C 系统编程中检查子进程的状态(不使用 SIGSTOP) - POSIX
- php - Differentiating a new post from updating a post on save_post hook
- json - 如何使用 Codable Protocol 在 swift 中为相同的结构使用 2 个编码键
- angular - Angular 无法从 HttpEvent 标头获取 ETag 标头