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

如何为Pandas DataFrame分组后的数值添加最大/最小标记列

为分组后的DataFrame添加最值标记列

原始数据与需求

原始DataFrame代码

import pandas as pd

d = {'Para1': ['Para1_1', 'Para1_1', 'Para1_2', 'Para1_2'], 
     'Para2': ['Para2_1', 'Para2_1', 'Para2_2', 'Para2_2'], 
     'ParaN': ['ParaN_1', 'ParaN_1', 'ParaN_2', 'ParaN_2'],
     'value':[0.5,0.3,0.01,0.5]}

df = pd.DataFrame(data=d)

原始输出

Para1    Para2    ParaN  value
0  Para1_1  Para2_1  ParaN_1   0.50
1  Para1_1  Para2_1  ParaN_1   0.30
2  Para1_2  Para2_2  ParaN_2   0.01
3  Para1_2  Para2_2  ParaN_2   0.50

需求

按Para1、Para2、ParaN的组合分组,为每组内的最大值标记max,最小值标记min,生成minmaxflag列,最终结果如下:

Para1    Para2    ParaN  value   minmaxflag
0  Para1_1  Para2_1  ParaN_1   0.50    max
1  Para1_1  Para2_1  ParaN_1   0.30    min
2  Para1_2  Para2_2  ParaN_2   0.01    min
3  Para1_2  Para2_2  ParaN_2   0.50    max

解决方案

方法一:通过分组最值对比标记

利用groupby.transform获取每组的最值,再通过apply对比生成标记列:

# 生成每组的最大值和最小值列
df['max_val'] = df.groupby(['Para1', 'Para2', 'ParaN'])['value'].transform('max')
df['min_val'] = df.groupby(['Para1', 'Para2', 'ParaN'])['value'].transform('min')

# 生成标记列
df['minmaxflag'] = df.apply(
    lambda row: 'max' if row['value'] == row['max_val'] else 'min',
    axis=1
)

# 删除临时列(可选)
df = df.drop(['max_val', 'min_val'], axis=1)

方法二:利用分组排名映射标记

针对每组固定两个值的情况,用rank函数对组内值排序,再映射为max/min:

# 按分组对value降序排名,最大值排1,最小值排2
df['rank'] = df.groupby(['Para1', 'Para2', 'ParaN'])['value'].rank(ascending=False, method='first')

# 映射排名为标记
df['minmaxflag'] = df['rank'].map({1: 'max', 2: 'min'})

# 删除临时列(可选)
df = df.drop('rank', axis=1)

两种方法均可得到符合要求的结果,方法一逻辑直观,适用于组内值数量不固定的场景;方法二更简洁,适合本题每组仅两个值的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:51:41