Pandas按Name分组后基于自定义类别排序保留每组最后一条数据
按自定义类别排序后分组保留每组最后一条数据
原始数据
import pandas as pd df = pd.DataFrame({ "Name": ["Tim", "Tim", "Tim", "Tim", "Tim",'Jack','Jack','Jack'], "Status": ["A1", "E1", "B3", "D4", "C90","A1","C90","B3"] })
需求
- 按
Name列分组 - 按照自定义顺序
B3 < A1 < D4 < C90 < E1对Status列排序 - 每个分组仅保留排序后的最后一条数据(即每个
Name对应其排序层级最高的Status)
原代码问题分析
- 类别设置错误:把目标值
E1写成了E90,导致原始数据中的E1被识别为无效类别值,排序逻辑混乱 - 排序范围错误:仅全局按
Status排序,没有按Name分组后在组内排序 - 去重列错误:使用
Status列去重,而不是按Name列去重保留每组最后一条
正确实现代码
步骤1:设置自定义有序类别
# 为Status列设置自定义有序类别,确保包含所有出现的取值 df["Status"] = pd.Categorical( df["Status"], categories=["B3", "A1", "D4", "C90", "E1"], ordered=True )
步骤2:分组排序并保留每组最后一条
方法一:先全局排序,再分组取末尾行
# 先按Name分组,再按Status排序,最后取每组最后一条 df_cleaned = df.sort_values(["Name", "Status"]).groupby("Name").tail(1)
方法二:排序后分组取last()
# 先按Name和Status排序,再分组保留每组最后一条 df_sorted = df.sort_values(["Name", "Status"]) df_cleaned = df_sorted.groupby("Name", as_index=False).last()
最终结果
运行上述代码后,df_cleaned的输出为:
Name Status 1 Tim E1 5 Jack C90
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

