Pandas基于客户匹配、4个月内日期差为DataFrame新增标记列
实现方案
两个DataFrame的日期是YYYYMM整数格式,直接做数值计算会有跨年份算错月份差的问题(比如202012和202101数值差89,实际只差1个月),所以先转成标准月份周期做差值计算,再按客户匹配判断即可,全程用pandas向量化操作,大数据量下性能比循环好很多。
示例数据构造
先按描述的场景构造测试数据,方便对照调试:
import pandas as pd # 第一个DataFrame:全量客户日期记录 df1 = pd.DataFrame({ 'client': ['A','A','A','A','A','B','B','B','B','C','C'], 'Date': [202001,202002,202004,202008,202009,202201,202205,202209,202210,202101,202105] }) # 第二个DataFrame:客户基准日期记录 df2 = pd.DataFrame({ 'client': ['A','B'], 'Date': [202004, 202205] })
核心处理代码
# 工具函数:把YYYYMM格式的列转成可直接计算月份差的整数(每加1代表过1个月) def trans2monthnum(series): return pd.to_datetime(series.astype(str), format='%Y%m').dt.to_period('M').astype('int') # 分别给两个表生成计算用的月份数值列 df1['_calc_month'] = trans2monthnum(df1['Date']) df2['_base_month'] = trans2monthnum(df2['Date']) # 左连接匹配同客户的基准月份 match_res = df1.merge(df2[['client', '_base_month']], on='client', how='left') # 计算月份差绝对值,无匹配客户的填充一个远大于4的数值 match_res['gap'] = (match_res['_calc_month'] - match_res['_base_month']).abs().fillna(999) # 按规则生成condition列 df1['condition'] = (match_res['gap'] <= 4).astype('int') # 清理临时计算列 df1.drop(columns=['_calc_month'], inplace=True)
结果说明
运行后得到的df1完全符合规则要求:
- 客户A的202001(差3个月)、202002(差2个月)、202004(差0个月)、202008(差4个月)都标记为1,202009差5个月标记为0
- 客户B的202201(差4个月)、202205(差0个月)、202209(差4个月)标记为1,202210差5个月标记为0
- 客户C不在第二个DataFrame中,所有记录标记为0
如果第二个DataFrame中同一个客户对应多条基准日期,只需要在merge后按df1的原始行号分组,取最小的月份差值再做判断即可,上述逻辑稍作修改就能兼容。
内容的提问来源于stack exchange,提问作者gumpy007
相关产品推荐
相关产品推荐

