如何用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:
| ID | Values |
|---|---|
| 1 | 10 |
| 1 | -15 |
| 1 | 5 |
| 2 | 20 |
| 2 | -10 |
| 2 | 25 |
| 3 | -5 |
| 3 | 8 |
| 3 | -12 |
执行核心代码后,会得到你预期的结果:
| ID | Values |
|---|---|
| 2 | 25 |
| 2 | 20 |
| 1 | -15 |
| 1 | 10 |
| 3 | -12 |
| 3 | 8 |
内容的提问来源于stack exchange,提问作者ForestGump
相关产品推荐
相关产品推荐

