You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按ID分组提取列的前2个最大绝对值?

解决方案

1. 提取每个ID的前2个最大绝对值行

你之前的代码仅完成了排序和分组,缺少对每个分组提取前N行的步骤。直接用sort_values+groupby+head就能实现需求:

# 按Values绝对值降序排序,再按ID分组取每个组的前2行
result = df.sort_values(by='Values', key=abs, ascending=False)\
           .groupby('ID', as_index=False)\
           .head(2)

如果需要重置结果的索引,追加.reset_index(drop=True)即可。

2. 解决ID过滤问题

不需要纠结groupby后无法用query的问题,先过滤再处理更直接:

# 示例:只保留ID为1、2的行,再执行分组提取
filtered_result = df.query("ID in [1,2]")\
                    .sort_values(by='Values', key=abs, ascending=False)\
                    .groupby('ID', as_index=False)\
                    .head(2)

也可以用布尔索引替代query:

filtered_result = df[df['ID'].isin([1,2])]\
                    .sort_values(by='Values', key=abs, ascending=False)\
                    .groupby('ID', as_index=False)\
                    .head(2)

如果是得到分组结果后再过滤ID,直接对结果用query就行:

# 先得到所有ID的结果,再过滤特定ID
result = df.sort_values(by='Values', key=abs, ascending=False)\
           .groupby('ID', as_index=False)\
           .head(2)
final_result = result.query("ID in [1,3]")

结果验证

还原你的原DataFrame:

IDValues
110
1-15
15
220
2-10
225
3-5
38
3-12

执行核心代码后,会得到你预期的结果:

IDValues
225
220
1-15
110
3-12
38

内容的提问来源于stack exchange,提问作者ForestGump

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:54:22