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

Pandas如何捕获分组Status列从Public转为其他值的变更日期

解决方案

你可以通过pandas的分组聚合逻辑实现需求,以下是可直接运行的代码:

import pandas as pd

# 1. 预处理:日期列转格式 + 按分组+日期升序排序,保证时间顺序正确
df["Date"] = pd.to_datetime(df["Date"], format="%d-%b-%y")
df = df.sort_values(by=["Student_Group_Number", "Date"], ignore_index=True)

# 2. 定义分组内的处理逻辑
def get_change_date(group):
    # 筛选分组内所有非Public状态的行
    non_public_rows = group[group["Status"] != "Public"]
    if len(non_public_rows) == 0:
        # 分组内全为Public,返回空
        return pd.Series([None], index=["Date_change"])
    # 取时间最早的非Public行的日期
    return pd.Series([non_public_rows.iloc[0]["Date"]], index=["Date_change"])

# 3. 分组应用逻辑 + 格式还原
result = df.groupby("Student_Group_Number", group_keys=False).apply(get_change_date).reset_index()
# 日期转回你需要的字符串格式,空值保留为空
result["Date_change"] = result["Date_change"].dt.strftime("%d-%b-%y").fillna("")

补充说明

  • 9万行的数据量用上述逻辑处理性能无压力,不需要额外优化。
  • 如果你需要严格符合「只有之前出现过Public的变更才统计」的规则(也就是Group4这类从来没有Public的分组返回空),只需要修改get_change_date函数即可:
def get_change_date(group):
    has_public = (group["Status"] == "Public").any()
    non_public_rows = group[group["Status"] != "Public"]
    if not has_public or len(non_public_rows) == 0:
        return pd.Series([None], index=["Date_change"])
    return pd.Series([non_public_rows.iloc[0]["Date"]], index=["Date_change"])
  • 运行完得到的result就是你要求的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:57:01