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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:33:11