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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:48:10