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

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)

原代码问题分析

  1. 类别设置错误:把目标值E1写成了E90,导致原始数据中的E1被识别为无效类别值,排序逻辑混乱
  2. 排序范围错误:仅全局按Status排序,没有按Name分组后在组内排序
  3. 去重列错误:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:50:26