求助:基于Group与近3个月付款日期覆盖DataFrame的payer_status字段
解决方案
1. 先把日期列转成可计算的datetime类型
原数据里的last_dt_of_payment是字符串格式,得先转成datetime才能做日期比较:
import pandas as pd from datetime import datetime import numpy as np # 构造你的原始DataFrame df = pd.DataFrame({ 'Id': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'], 'last_dt_of_payment': ['22/08/2022', '21/05/2022', '01/09/2022', '22/01/2022', '26/02/2022', '30/09/2022'], 'Group': ['x', 'x', 'y', 'y', 'p', 's'], 'payer_status': [1, 1, 1, 1, 1, 1] }) # 转换日期列,注意格式是dd/mm/yyyy df['last_dt_of_payment'] = pd.to_datetime(df['last_dt_of_payment'], format='%d/%m/%Y')
2. 确定「最近3个月」的基准日期
如果你是基于某个固定日期(比如示例里的2022-09-30)计算,直接指定就行;如果要基于当前日期,用pd.DateOffset算严格的3个月前:
# 示例用固定基准日期2022-09-30,往前推3个月 base_date = pd.to_datetime('2022-09-30') three_months_ago = base_date - pd.DateOffset(months=3) # 结果是2022-06-30 # 如果是基于当前日期计算: # three_months_ago = datetime.now() - pd.DateOffset(months=3)
3. 按条件更新payer_status
用np.where嵌套判断,只针对x/y组修改,其他组保持原状态:
# 核心条件:属于x/y组,且付款日期在3个月内 valid_condition = (df['Group'].isin(['x', 'y'])) & (df['last_dt_of_payment'] >= three_months_ago) # 更新规则:满足条件设1,x/y组不满足设0,非x/y组保留原值 df['payer_status'] = np.where(valid_condition, 1, np.where(df['Group'].isin(['x', 'y']), 0, df['payer_status']))
最终结果
执行后得到的DataFrame和你期望的完全一致:
Id last_dt_of_payment Group payer_status 0 A1 2022-08-22 x 1 1 A2 2022-05-21 x 0 2 A3 2022-09-01 y 1 3 A4 2022-01-22 y 0 4 A5 2022-02-26 p 1 5 A6 2022-09-30 s 1
补充提示
用pd.DateOffset(months=3)比直接减90天更准确,因为不同月份天数不一样,比如2月只有28/29天,用月份偏移能精准算到3个月前的同一天。
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

