python - 分组并查找属于 n 个唯一最大值的所有值
问题描述
我的数据框:
data = {'Input':[133217,133217,133217,133217,133217,133217,132426,132426,132426,132426,132426,132426,132426,132426],
'Font':[30,25,25,21,20,19,50,50,50,38,38,30,30,29]}
Input Font
0 133217 30
1 133217 25
2 133217 25
3 133217 21
4 133217 20
5 133217 19
6 132426 50
7 132426 50
8 132426 50
9 132426 38
10 132426 38
11 132426 30
12 132426 30
13 132426 29
我想创建一个新的数据框,其中仅包含属于 3 个唯一最大值的字体中的值。例如,输入 133217 的 3 个最大字体值为 30、25、21。
预期输出:
op_data = {'Input':[133217,133217,133217,133217,132426,132426,132426,132426,132426,132426,132426],
'Font':[30,25,25,21,50,50,50,38,38,30,30]}
Input Font
0 133217 30
1 133217 25
2 133217 25
3 133217 21
4 132426 50
5 132426 50
6 132426 50
7 132426 38
8 132426 38
9 132426 30
10 132426 30
我用 pandas 的 groupby 试过这个:
df = pd.DataFrame(data)
df['order'] = df.groupby('Input').cumcount()+1
然后我考虑了 1,2,3 中的值df['order']
,但没有按计划进行。有什么替代方法吗?
解决方案
您可以找到每个组的唯一值,获取具有三个最大值的列表并选择此列表中的行:
df.groupby('Input')['Font'].\
apply(lambda x: x[x.isin(np.sort(x.unique())[-3:])]).\
reset_index(level=0)
输出:
Input Font
6 132426 50
7 132426 50
8 132426 50
9 132426 38
10 132426 38
11 132426 30
12 132426 30
0 133217 30
1 133217 25
2 133217 25
3 133217 21
推荐阅读
- amazon-web-services - 使用 Steam 社交登录的 AWS Cognito 注册
- c++ - 为 std::any_of 等提供反向迭代器是否有意义?
- cron - 如何使用 cron 创建 cron 作业以 grep 某些文件
- python - 在图像前放置标签
- dependency-injection - Loopback 4 模型相关的逻辑和存储库访问
- java - 按对象的两个字段排序。爪哇
- node.js - 如何配置 NGINX 以代理 API 调用到部署在 Kubernetes 上的后端?
- java - 识别单独的 websocket 请求 + spring boot
- xml - AGL 小部件的 config.xml 文件中的 required-api: param name="#target" 是什么意思?
- php - 我在 Controller 中的变量未加载到刀片