如何从含非整数月份的DataFrame按临近规则提取整数月SurvProb值
实现方案
基于pandas的merge_asof方法可以快速实现该匹配逻辑,该方法原生支持时序类场景下「找小于等于目标值的最近记录」的匹配规则,完全适配需求,步骤如下:
- 预处理原数据,保证
Months列按升序排列(merge_asof要求连接键必须有序) - 生成24.0~48.0步长为1的目标整数月份序列
- 执行asof左连接,自动匹配每个目标月份对应的SurvProb值
可直接运行的代码示例
import pandas as pd import numpy as np # --------------- 替换为你自己的dataframe即可 --------------- # 样例数据构造 df = pd.DataFrame({ 'Months': [23.9, 24.3, 26.5, 27.0, 28.1, 28.9, 30.3, 67], 'SurvProb': [100, 99, 98, 98, 97, 94, 90, 40] }) # ----------------------------------------------------------- # 原数据按月份升序排序 df = df.sort_values('Months').reset_index(drop=True) # 生成目标查询月份:24到48的整数月,转成float和原列类型对齐 target_months = pd.DataFrame({ 'Months': np.arange(24, 49, 1, dtype=float) }) # 执行asof匹配,backward方向即取小于等于目标月份的最近一条记录 result = pd.merge_asof( target_months, df, on='Months', direction='backward', allow_exact_matches=True ) # 无索引打印,输出格式和预期一致 print(result.to_string(index=False))
匹配效果验证
用给出的样例数据运行后,前几行输出完全符合规则要求:
Months SurvProb 24.0 100 25.0 99 26.0 99 27.0 98 28.0 98 29.0 94 30.0 94
注意事项
- 如果原数据中不存在小于24的月份记录,24月的匹配结果会是空值,使用前可以先通过
df['Months'].min() <=24做边界校验 - 该方法运行效率远高于循环逐行查找,十万级以上数据量也能秒级返回结果
内容的提问来源于stack exchange,提问作者Lei Deng
相关产品推荐
相关产品推荐

