如何为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
相关产品推荐
相关产品推荐

