如何基于指定DEV值对Pandas DataFrame重采样插值并解决重复轴报错
报错原因
- 未按年度分组处理DEV序列:DEV是每个年度独立的递增序列,不同年份存在相同DEV值,直接全局将DEV设为索引会产生大量重复索引值,触发reindex的重复轴错误
- 过滤原数据中属于DEV_LIST的DEV记录是多余操作,不符合你保留原有全部DEV值的需求
- 全局合并DEV并集时未区分年度,进一步加剧索引重复问题
正确实现代码
import pandas as pd # 配置参数 DEV_LIST = [0, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] # 第一步:预处理原始数据,删除空值,按年度+DEV排序保证序列连续 df_clean = df.dropna(subset=['DEV', 'PRICE']).sort_values(['YEAR', 'DEV']).reset_index(drop=True) # 第二步:按年度分组单独插值,避免跨年度DEV干扰 res_list = [] for year, group in df_clean.groupby('YEAR'): # 取当前年度的DEV、PRICE字段,设DEV为索引 group_idx = group.set_index('DEV')[['PRICE']] # 合并原有DEV和目标DEV,去重后升序排列 all_dev = sorted(set(group_idx.index.tolist() + DEV_LIST)) # 重索引后按DEV数值间距插值 group_interp = group_idx.reindex(all_dev).interpolate(method='values').reset_index() # 补回年度字段方便后续关联其他信息 group_interp['YEAR'] = year res_list.append(group_interp) # 第三步:合并所有年度结果得到最终表 final_df = pd.concat(res_list, ignore_index=True)
代码说明
- 先清理DEV、PRICE为空的无效行,按年度+DEV排序保证每年的发育序列是连续递增的
- 按年度分组处理,从根源避免不同年份DEV重复导致的索引问题,同时每一年的插值仅基于当年的实际价格序列,结果更符合业务逻辑
- 合并每年度原有DEV和目标DEV后去重,同时保留全部原始数据和新增的指定DEV监测节点
- 插值采用
values方法,基于DEV的数值间距计算插值结果,匹配发育阶段连续变化的特性
得到的final_df既包含原数据所有DEV对应的原始PRICE,也包含DEV_LIST中指定节点的插值后PRICE,按DEV升序排列,符合你给出的样例输出格式。如果需要回补日期等其他字段,可基于YEAR+DEV和原数据做匹配,或在分组处理时保留对应字段关联即可。
内容的提问来源于stack exchange,提问作者Luckasino
相关产品推荐
相关产品推荐

