如何基于df2的target_date为df1创建含姓名匹配的90天日期筛选
解决方案:结合姓名匹配与日期筛选
关键问题分析
你的代码缺少姓名匹配逻辑,且两个数据集的姓名格式不统一(比如df2的J.Smith对应df1的John Smith,Jeter, Derek对应Derek Jeter),这会导致匹配失败。同时需确保日期列转为datetime类型,才能正确计算时间差。
步骤1:统一日期格式
先将两个数据集的日期列转换为可计算的datetime类型:
import pandas as pd from datetime import timedelta # 转换df1的日期列 df1['start_date'] = pd.to_datetime(df1['start_date']) df1['end_date'] = pd.to_datetime(df1['end_date']) # 转换df2的日期列 df2['target_date'] = pd.to_datetime(df2['target_date'])
步骤2:标准化姓名格式
编写函数统一姓名格式,解决缩写、倒序的匹配问题:
def normalize_name(name): # 处理倒序姓名(如Jeter, Derek → Derek Jeter) if ',' in name: last, first = name.split(', ', 1) return f"{first} {last}" # 处理缩写姓名(如J.Smith → John Smith,可根据实际数据扩展映射) elif '.' in name: name_map = { 'J.Smith': 'John Smith', # 补充其他缩写映射 } return name_map.get(name, name) # 格式一致的姓名直接返回 else: return name # 标准化df2的员工姓名列 df2['standard_name'] = df2['emp_name'].apply(normalize_name)
步骤3:结合姓名匹配与日期筛选
修改循环逻辑,同时加入姓名匹配和日期筛选条件:
filtered_dfs = [] for _, row in df2.iterrows(): threshold_date = row['target_date'] - timedelta(days=90) # 同时匹配姓名与日期条件 matched_rows = df1[ (df1['name'] == row['standard_name']) & (df1['end_date'] <= threshold_date) ] filtered_dfs.append(matched_rows) # 合并所有筛选结果 result_df = pd.concat(filtered_dfs, ignore_index=True) print(result_df)
输出结果
运行后将得到符合需求的筛选结果:
id name start_date end_date team 0 1234 John Smith 2022-01-01 2022-02-01 Sales 1 1234 John Smith 2022-02-01 2022-04-02 Sales 2 4321 Derek Jeter 2022-07-23 2022-08-12 Tech 3 5678 Joe Dirt 2023-01-23 2023-03-21 HR
优化建议
如果姓名格式复杂(比如更多缩写、中间名),可以用更灵活的匹配逻辑,比如提取姓氏和首字母进行模糊对比,避免硬编码映射。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

