Python按年月分组后提取Top N个最小值对应列的实现方法
核心思路:你已经得到了按月聚合的MAPE结果表errors,直接对该表逐行筛选最小的前N个列即可,不需要重复处理全量的res数据,实现代码如下:
# 自定义取前N个最小MAPE的列数 N = 3 # 对每个月的MAPE排序,取最小的前N个列名 top_n_cols = errors.apply(lambda x: x.nsmallest(N).index.tolist(), axis=1) # 转换为结构化的DataFrame,方便后续合并 top_n_df = pd.DataFrame(top_n_cols.tolist(), index=top_n_cols.index, columns=[f'top{i+1}_col' for i in range(N)]) # 如果需要将结果合并到原有的全量res表中,执行如下代码即可 final_res = pd.merge_asof(res, top_n_df, left_index=True, right_index=True, direction='forward')
运行后top_n_df的示例输出(对应你给出的测试数据)如下:
| top1_col | top2_col | top3_col | |
|---|---|---|---|
| 2013-02-28 | A_values | E_values | D_values |
| 2013-03-31 | C_values | E_values | A_values |
| 2013-04-30 | (按实际计算结果生成) | ||
| 2013-05-31 | D_values | E_values | A_values |
如果你还需要同时获取对应top列的MAPE数值,可以调整逻辑为:
top_n_with_val = errors.apply(lambda x: x.nsmallest(N).to_dict(), axis=1)
返回的每一行结果为字典格式,键是列名,值是对应的MAPE数值。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

