如何在Pandas中基于近似日期与姓名匹配合并列不同的DataFrame
解决Pandas DataFrame基于近似日期和姓名前缀的合并问题
步骤1:对齐姓名字段
df1的seller是短名,df2是全名,我们可以从df2的全名中提取空格分隔的第一个部分作为匹配用的短名:
# 从df2的全名提取短名,和df1的seller字段对齐 df2['seller_short'] = df2['seller'].str.split(' ', expand=True)[0]
步骤2:确保日期格式统一(若未完成)
如果还没将日期列转为datetime类型,执行以下代码:
df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date'])
步骤3:基于姓名匹配+近似日期筛选合并
先按短名合并两个DataFrame,再筛选出日期差值在允许范围内的行(示例中允许最多1天的日期差,可按需调整):
# 按姓名前缀初步合并 merged_temp = pd.merge(df1, df2, left_on='seller', right_on='seller_short', suffixes=('_df1', '_df2')) # 筛选日期差≤1天的结果 merged_result = merged_temp[abs(merged_temp['date_df1'] - merged_temp['date_df2']) <= pd.Timedelta(days=1)] # 清理临时字段(可选) merged_result = merged_result.drop(columns=['seller_short'])
示例输出说明
执行后会得到符合条件的合并结果:
- John(df1,2023-07-25)匹配John Russell(df2,2023-07-25)
- Alice(df1,2023-07-26)匹配Alice Perry、Alice Mcgee(均为2023-07-26)
- Bob(df1,2023-07-27)匹配Bob Foster(2023-07-27)
- Alice(df1,2023-07-28)因与df2中Alice的日期差2天,会被过滤
额外提示
- 若姓名匹配规则更复杂(如存在名在后的情况),可改用正则表达式提取目标部分,例如
df2['seller_short'] = df2['seller'].str.extract(r'^(\w+)') - 可根据业务需求调整日期差值阈值,比如允许2天差则改为
pd.Timedelta(days=2) - 若存在同短名多全名的情况,可进一步通过业务规则去重
内容的提问来源于stack exchange,提问作者Guilherme Henrique Favaro
相关产品推荐
相关产品推荐

