如何在pandas中按账户标记缺失的起始/结束日期
Pandas 账户新增/流失标记实现方案
核心逻辑
标记规则完全基于全局日期边界和单账户的记录日期范围判断,不需要复杂操作:
- 先计算全数据集的全局最早日期、全局最晚日期作为统计周期的边界
- 按账户维度分组,统计每个账户自身第一条记录的日期、最后一条记录的日期
- 两个标记的判断规则:
- 新增账户:账户首条记录日期晚于全局最早日期,说明统计周期起始日该账户无记录,是周期内新进入的
- 不再存续账户:账户末条记录日期早于全局最晚日期,说明统计周期截止日该账户无记录,周期结束前已无有效记录
代码实现
首先构造和描述一致的样例数据,包含3个测试账户,其中账户2缺失首日记录、账户3缺失末日记录:
import pandas as pd # 构造样例数据 df = pd.DataFrame([ {"Account": 1, "Date": "2022-03-01", "Balance": 100}, {"Account": 1, "Date": "2022-03-02", "Balance": 120}, {"Account": 1, "Date": "2022-03-03", "Balance": 90}, {"Account": 2, "Date": "2022-03-02", "Balance": 200}, {"Account": 2, "Date": "2022-03-03", "Balance": 210}, {"Account": 3, "Date": "2022-03-01", "Balance": 300}, {"Account": 3, "Date": "2022-03-02", "Balance": 350}, ]) # 务必先将日期列转为datetime格式,避免字符串比较出错 df["Date"] = pd.to_datetime(df["Date"])
接下来计算边界值、打标记:
# 计算全局统计周期的首尾日期 global_start_date = df["Date"].min() global_end_date = df["Date"].max() # 按账户分组,取每个账户的首条、末条记录日期 acc_period = df.groupby("Account")["Date"].agg( acc_first_date="min", acc_last_date="max" ).reset_index() # 将账户维度的日期信息合并回原明细表 df = df.merge(acc_period, on="Account", how="left") # 生成两个标记列 df["is_new_account"] = df["acc_first_date"] > global_start_date df["is_inactive_account"] = df["acc_last_date"] < global_end_date # 清理中间辅助列 df = df.drop(columns=["acc_first_date", "acc_last_date"])
结果验证
运行代码后输出的结果符合预期:
- 账户1全周期都有记录,两个标记均为
False,属于周期内存量活跃账户 - 账户2所有记录的
is_new_account均为True,属于周期内新增账户 - 账户3所有记录的
is_inactive_account均为True,属于周期内已停止存续的账户
提示:如果业务场景中允许账户偶发漏报、需要连续缺失N天才判定为不再存续,可以在分组统计账户末条记录日期后,额外增加日期差判断逻辑,调整阈值即可适配。
内容的提问来源于stack exchange,提问作者robs
相关产品推荐
相关产品推荐

