Python中使用pd.merge_asof时如何避免df2数据被重复复用
解决方法
pd.merge_asof本身没有内置「匹配后标记df2行为已使用、禁止重复匹配」的逻辑,你可以通过添加辅助列+合并后过滤的方式实现需求,通用方案如下:
完整实现代码
import pandas as pd import datetime as dt # 构造示例数据 df1 = pd.DataFrame({'date': [dt.datetime(2020, 1, 2), dt.datetime(2020, 2, 2), dt.datetime(2020, 3, 2)], 'id': ['a', 'a', 'a']}) df2 = pd.DataFrame({'date': [dt.datetime(2020, 1, 1)], 'id': ['a'], 'value': ['1']}) # 第一步:为两个表添加组内序号辅助列 # df1按id分组、日期升序,添加组内序号 df1 = df1.sort_values(['id', 'date']).assign(rn=lambda x: x.groupby('id').cumcount()) # df2按id分组、日期升序,添加组内序号 df2 = df2.sort_values(['id', 'date']).assign(rn_df2=lambda x: x.groupby('id').cumcount()) # 第二步:正常执行merge_asof merged = pd.merge_asof(df1, df2, on='date', by='id', direction='backward', allow_exact_matches=True) # 第三步:按id+df2组内序号分组,仅保留每组第一条匹配结果,其余置空 merged['value'] = merged.groupby(['id', 'rn_df2'])['value'].transform(lambda x: x.head(1)) # 第四步:删除辅助列,得到最终结果 merged = merged.drop(columns=['rn', 'rn_df2']) print(merged)
输出结果
date id value 0 2020-01-02 a 1 1 2020-02-02 a NaN 2 2020-03-02 a NaN
该方案对单id下有多条df2记录的场景同样适用,每条df2的记录仅会匹配到df1中符合日期条件的最早一条数据,不会被重复复用。
内容的提问来源于stack exchange,提问作者mf17
相关产品推荐
相关产品推荐

