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

使用Python Pandas遍历Cycle分组标记极值点(最大值A/最小值B)

为Pandas分组数据的最大值/最小值标记特定字符

问题描述

用户有如下数据集:

data = {'Cycle': ['Set1', 'Set1', 'Set1', 'Set2', 'Set2', 'Set2', 'Set2'],
        'Value': [1, 2.2, .5, .2,1,2.5,1]}

需要实现:按Cycle列分组,每组内的最大值标记'A',最小值标记'B',其余标记0,最终得到如下格式的DataFrame:

POI = {'Cycle': ['Set1', 'Set1', 'Set1', 'Set2', 'Set2', 'Set2', 'Set2'],
        'Value': [1, 2.2, .5, .2,1,2.5,1],
         'POI': [0, 'A','B','B',0,'A',0]}

df2 = pd.DataFrame(POI)

分步实现(新手友好)

步骤1:导入依赖库

先确保安装了pandas和numpy(没安装的话,终端执行pip install pandas numpy),然后导入:

import pandas as pd
import numpy as np

步骤2:创建初始DataFrame

把原始字典数据转换成Pandas的DataFrame,这是Pandas处理数据的基础格式:

data = {'Cycle': ['Set1', 'Set1', 'Set1', 'Set2', 'Set2', 'Set2', 'Set2'],
        'Value': [1, 2.2, .5, .2,1,2.5,1]}
df = pd.DataFrame(data)

步骤3:获取每组的最大/最小值映射

用groupby('Cycle')按Cycle列分组,再用transform('max')和transform('min')计算每组的最大、最小值,关键是transform会把组内的统计结果对应回原DataFrame的每一行,不用手动匹配行和分组:

# 每行对应的组内最大值
group_max = df.groupby('Cycle')['Value'].transform('max')
# 每行对应的组内最小值
group_min = df.groupby('Cycle')['Value'].transform('min')

步骤4:生成POI标记列

用嵌套的np.where做条件判断,依次匹配最大值、最小值,剩下的情况设为0:

df['POI'] = np.where(df['Value'] == group_max, 'A',
                     np.where(df['Value'] == group_min, 'B', 0))

步骤5:查看最终结果

打印df就能得到目标结果:

print(df)

输出和要求的df2完全一致。

手动遍历分组的逻辑(仅作理解)

如果想理解分组遍历的底层逻辑,下面是手动循环的写法(实际不推荐,效率低且代码繁琐):

# 先初始化POI列为0
df['POI'] = 0
# 遍历每个分组:cycle是分组名,group是该组的子DataFrame
for cycle, group in df.groupby('Cycle'):
    # 找到当前组最大值对应的行索引
    max_rows = group[group['Value'] == group['Value'].max()].index
    # 找到当前组最小值对应的行索引
    min_rows = group[group['Value'] == group['Value'].min()].index
    # 给对应索引的POI列赋值
    df.loc[max_rows, 'POI'] = 'A'
    df.loc[min_rows, 'POI'] = 'B'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:27:22