如何使用Pandas按Meter_indication最近值合并两个DataFrame
按里程表最近值匹配合并两个DataFrame的实现方案
假设待合并的两个DataFrame分别为df1(含Meter_indication、Fuel1字段)、df2(含Meter_indication、Fuel2字段),可按以下步骤实现精准匹配,避免重复行、跨值错误匹配问题:
- 首先对两个表的
Meter_indication列做清洗,删除空值、统一转为float数值类型,排除非数字异常值 - 若单个表内存在重复的
Meter_indication记录,先按业务规则聚合(如取Fuel字段均值、最新值),避免后续匹配生成重复行 - 两个表均按
Meter_indication列升序排序
方案1:merge_asof优化方案(性能最优,适合里程严格递增的场景)
import pandas as pd # 预处理 df1 = df1.dropna(subset=['Meter_indication']).sort_values('Meter_indication').reset_index(drop=True) df2 = df2.dropna(subset=['Meter_indication']).sort_values('Meter_indication').reset_index(drop=True) # 单表重复值聚合,可根据实际业务调整聚合逻辑 df1 = df1.groupby('Meter_indication', as_index=False)['Fuel1'].mean() df2 = df2.groupby('Meter_indication', as_index=False)['Fuel2'].mean() # 最近值合并 merged = pd.merge_asof( left=df1, right=df2, on='Meter_indication', direction='nearest', # 核心参数:开启最近值匹配,而非默认的向后/向前匹配 tolerance=5 # 可自定义允许的最大里程偏差,单位km,超过该偏差的记录不会匹配,避免跨值错误匹配 ) # 过滤未匹配成功的记录,若需保留未匹配行可删除该行 merged = merged.dropna(subset=['Fuel2']) # 输出指定字段 result = merged[['Meter_indication', 'Fuel1', 'Fuel2']]
方案2:KD树最近邻匹配方案(兼容性更强,适合里程非严格递增的场景)
import pandas as pd from sklearn.neighbors import KDTree import numpy as np # 预处理逻辑和上文一致 df1 = df1.dropna(subset=['Meter_indication']).reset_index(drop=True) df2 = df2.dropna(subset=['Meter_indication']).reset_index(drop=True) df1 = df1.groupby('Meter_indication', as_index=False)['Fuel1'].mean() df2 = df2.groupby('Meter_indication', as_index=False)['Fuel2'].mean() # 构建KD树匹配最近里程 tree = KDTree(df2[['Meter_indication']]) max_tolerance = 5 # 自定义最大允许偏差,单位km distances, indices = tree.query(df1[['Meter_indication']], k=1) # 过滤偏差超限的匹配结果 valid_idx = distances.flatten() <= max_tolerance df1.loc[valid_idx, 'Fuel2'] = df2.iloc[indices.flatten()[valid_idx]]['Fuel2'].values # 生成最终结果 result = df1.dropna(subset=['Fuel2'])[['Meter_indication', 'Fuel1', 'Fuel2']].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Leopold Wahlbeck
相关产品推荐
相关产品推荐

