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

