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

如何用Python获取Pandas分组后每组最后阶段值并添加为新列?

解决为每个Name添加对应最后一个Stage列的问题

首先说下你代码报错的原因:当你用df.apply(stage, axis=1)时,传给stage函数的不是整个DataFrame,而是每一行的Series对象。你在函数里循环df['Name'],这时候的df其实是单行数据,df['Name']就是单个字符串(比如'a'),之后你调用df['Stage'].iloc[-1],但这里的df['Stage']是单个字符串值,根本不是带索引的Series,自然没有iloc方法,所以才会抛出AttributeError。

下面给你几个简单高效的正确解法,都能完美实现你的需求:

方法一:groupby + transform(最推荐)

这是最简洁高效的方式,先按Name分组,然后取每组最后一个Stage,再用transform把结果自动广播到每一行:

df['Last_Stage'] = df.groupby('Name')['Stage'].transform(lambda x: x.iloc[-1])

groupby('Name')把数据按姓名分组,transform会将每组的计算结果(最后一个Stage)对应到原DataFrame的每一行,完全匹配你的期望输出。

方法二:字典映射法

先提取每个Name对应的最后一个Stage生成字典,再用map快速映射到新列:

# 生成Name到最后一个Stage的字典
last_stage_map = df.groupby('Name')['Stage'].last().to_dict()
# 映射到原DataFrame
df['Last_Stage'] = df['Name'].map(last_stage_map)

groupby('Name')['Stage'].last()会直接获取每组最后一个Stage的值,转成字典后用map匹配,速度很快,逻辑也清晰。

方法三:合并DataFrame法

先创建一个只包含Name和对应最后一个Stage的临时表,再和原表合并:

# 创建临时DataFrame,只保留Name和对应的最后一个Stage
last_stage_df = df.groupby('Name').last()[['Stage']].rename(columns={'Stage': 'Last_Stage'}).reset_index()
# 左合并到原DataFrame
df = df.merge(last_stage_df, on='Name', how='left')

这种方法更适合喜欢用合并逻辑的场景,结果和前两种完全一致。

测试一下这些方法,用你的示例数据运行后,就能得到你想要的输出啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:52:45