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

