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

Pandas分组后获取绝对值最大的数值(保留原符号)

解决Pandas分组后取绝对值最大且保留原符号的问题

我来帮你搞定这个需求!你现在的问题是分组后需要基于绝对值判断最大值,但同时保留原数值的符号,普通的agg({'z': ['max']})只会取数值上的最大值,没法满足你要的结果。

先上可行的解决方案

方法一:自定义聚合函数

我们可以写一个简单的自定义函数,先找到分组内绝对值最大的元素,再返回它的原数值:

import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame(
    [
        ['chart.a', 'dim1', -10],
        ['chart.a', 'dim2', 5],
        ['chart.a', 'dim3', 9],
        ['chart.b', 'dimb1', -1],
        ['chart.b', 'dimb2', 2],
    ],
    columns=['chart', 'dim', 'z']
)

# 自定义聚合函数:取绝对值最大的原数值
def abs_max(x):
    return x.loc[x.abs().idxmax()]

# 分组聚合并调整列名
result = df.groupby('chart').agg({'z': [abs_max]}).rename(columns={'abs_max': 'max'})
print(result)

运行后输出完全符合你的期望:

z
        max
chart
chart.a -10
chart.b   2

方法二:更简洁的lambda写法

如果你不想单独定义函数,也可以用lambda表达式直接实现:

result = df.groupby('chart')['z'].apply(lambda x: x.loc[x.abs().idxmax()]).to_frame().rename(columns={'z': 'max'})
# 如果你需要保持和原结果一样的多层列结构,可以再unstack
result = result.unstack()

为什么原来的方法不对?

你之前用的df.groupby('chart').agg({'z': ['max']})是直接比较z列的数值大小,-10的数值比9小,所以会返回9;但我们需要的是绝对值最大的元素,所以必须先计算每个值的绝对值,找到最大绝对值对应的原数值,这样才能保留符号。

补充说明

  • 如果分组里有多个元素绝对值相同(比如同时存在10和-10),idxmax()会返回第一个出现的元素的索引,你可以根据自己的需求调整这个逻辑(比如返回最后一个,或者全部返回)。
  • 两种方法都能高效处理你的需求,自定义函数更直观,lambda写法更简洁,选哪种都可以~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:57:42