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

基于姓名检测到期日前连续3次付款拒付的技术实现问询

解决思路与代码实现

步骤1:数据合并与预处理

先将两个DataFrame按用户名关联,让每条付款记录对应到用户的到期日,再过滤出到期日前的付款记录,最后按用户和付款日期排序,保证后续连续序列判断的时间顺序正确。

import pandas as pd

# 假设DF1结构:name(用户名), due_date(到期日)
# DF2结构:name(用户名), payment_date(付款日期), status(付款状态)
# 合并数据集
merged_df = pd.merge(DF1, DF2, on='name', how='left')
# 统一日期格式(若原始数据为字符串,先转为datetime类型)
merged_df['due_date'] = pd.to_datetime(merged_df['due_date'])
merged_df['payment_date'] = pd.to_datetime(merged_df['payment_date'])
# 筛选到期日前的付款记录
merged_df = merged_df[merged_df['payment_date'] <= merged_df['due_date']]
# 按用户、付款日期排序
merged_df = merged_df.sort_values(by=['name', 'payment_date'])

步骤2:识别连续3次及以上的拒付序列

通过分组标记连续相同状态的片段,统计每个片段的长度,筛选出拒付状态且连续次数≥3的用户。

# 给每个用户的连续相同状态标记分组ID:状态变化时分组ID递增
merged_df['status_group'] = merged_df.groupby('name')['status'].apply(
    lambda x: (x != x.shift()).cumsum()
)

# 统计每个状态分组的类型和记录数
group_summary = merged_df.groupby(['name', 'status_group']).agg(
    current_status=('status', 'first'),
    consecutive_count=('status', 'size')
).reset_index()

# 筛选存在连续3次及以上拒付的用户
target_users = group_summary[
    (group_summary['current_status'] == 'declined') & 
    (group_summary['consecutive_count'] >= 3)
]['name'].unique()

步骤3:生成最终标记

将筛选结果映射回原始DF1,符合条件的用户标记1,否则标记0。

# 给DF1添加标记列
DF1['has_consecutive_declined'] = DF1['name'].isin(target_users).astype(int)

关键说明

  • 状态分组逻辑:status_group通过对比当前行与上一行的状态,状态变化时生成新分组ID,确保连续相同状态被归为一组。
  • 空值处理:若用户无到期前付款记录,会自动标记0,符合需求。
  • 日期校验:必须确保日期列是datetime类型,否则无法正确比较时间先后。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:18:24