如何匹配两个dataframe中数值最接近的对应行并生成新表
实现方法
我们可以通过pandas的apply方法搭配自定义匹配函数实现需求,完整代码和逻辑如下:
步骤1:导入依赖并构造测试数据
import pandas as pd # 构造题目给出的两个示例DataFrame df_1 = pd.DataFrame({'c1': ['a', 'b', 'c'], 'c2': [0, 0, 2]}) df_2 = pd.DataFrame({'c3': ['d', 'e', 'f'], 'c4': [2, 3, 7]})
步骤2:编写最接近值匹配函数
def get_closest_row(target_val): # 计算df_2中所有c4值和目标值的绝对差 diff_series = abs(df_2['c4'] - target_val) # 取差值最小的第一行的索引(如果有多个相同最小差值,默认取最先出现的行,符合示例要求) min_diff_idx = diff_series.idxmin() # 返回匹配到的c3值 return df_2.loc[min_diff_idx, 'c3']
步骤3:执行匹配生成结果
# 对df_1的每一行c2值执行匹配,新增匹配到的c3列 df_1['matched_c3'] = df_1['c2'].apply(get_closest_row) # 如果你需要输出题目示例里的字符串格式,可以执行以下代码 formatted_result = df_1.apply(lambda row: f"{row['c1']}, {row['matched_c3']}", axis=1) print(formatted_result.to_list())
输出结果说明
执行后最终得到的合并DataFrame结构如下:
| c1 | c2 | matched_c3 |
|---|---|---|
| a | 0 | d |
| b | 0 | d |
| c | 2 | d |
完全符合题目给出的示例要求。如果需要调整多最小差值场景的匹配优先级,只需要修改get_closest_row函数内的索引选取逻辑即可。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

