基于姓名检测到期日前连续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
相关产品推荐
相关产品推荐

