如何在DataFrame中为AGE_IN_MONTHS列匹配Age列的最近值?
解决DataFrame中AGE_IN_MONTHS匹配Age列最近值的问题
需求明确
把AGE_IN_MONTHS列的每个值,对应到Age列的数值:有相等值就直接用,没有就找Age里最接近的那个。
你之前的方法问题分析
1. for循环的问题
你写的这段循环逻辑根本走不起来:
for i in df3['AGE_IN_MONTHS']: if i == df3['Age']:
- 单个数值
i和整列df3['Age']比较,返回的是一整组布尔值,不是单个判断结果 - 既没处理“不相等”的情况,也没把匹配结果存到任何地方
- pandas里尽量别用逐行循环,效率极低,完全没必要
2. 差值取最小的问题
closest = df3.iloc[(df3['AGE_IN_MONTHS']-df3['Age']).abs()[:1]]
- 这段是算整列
AGE_IN_MONTHS和Age的差值绝对值,然后取第一个最小的行——这是全局找一个最近值,不是给每个AGE_IN_MONTHS单独匹配Age里的对应值,逻辑完全错了。
正确实现方式
方法1:逐值匹配(小数据集适用)
用apply给每个AGE_IN_MONTHS值找Age列里的最近值:
import numpy as np def get_closest_age(month_val, age_list): # 计算当前值和所有Age的差值绝对值 diffs = np.abs(age_list - month_val) # 返回差值最小的那个Age值 return age_list.iloc[diffs.argmin()] # 生成匹配后的结果列 df3['MATCHED_AGE'] = df3['AGE_IN_MONTHS'].apply(get_closest_age, age_list=df3['Age'])
方法2:高效批量匹配(大数据集推荐)
如果Age列可以排序,用pd.merge_asof速度快很多:
# 先把Age列去重并排序(merge_asof要求右表的键必须是排序好的) unique_ages = df3[['Age']].sort_values('Age').drop_duplicates() # 用merge_asof匹配最近值 df3 = pd.merge_asof( df3.sort_values('AGE_IN_MONTHS'), unique_ages, left_on='AGE_IN_MONTHS', right_on='Age', direction='nearest' ).sort_index()
direction='nearest'会自动优先匹配相等值,没有的话找最接近的- 最后
sort_index()是为了恢复原DataFrame的行顺序
测试示例
假设你的DataFrame是这样:
import pandas as pd df3 = pd.DataFrame({ 'AGE_IN_MONTHS': [12, 15, 20, 25], 'Age': [12, 18, 22] })
运行方法1后,MATCHED_AGE列会得到[12, 18, 22, 22],完全符合需求。
内容的提问来源于stack exchange,提问作者Manuel Torres
相关产品推荐
相关产品推荐

