多索引DataFrame中使用asfreq('D')插值报错的解决方法
多索引DataFrame分组插值报错的解决方法
问题场景
先创建两个带日期索引的DataFrame:
import pandas as pd frame1=pd.DataFrame({'dates':['2023-01-01','2023-01-07','2023-01-09'],'values':[0,18,28]}) frame1['dates']=pd.to_datetime(frame1['dates']) frame1=frame1.set_index('dates') frame2=pd.DataFrame({'dates':['2023-01-08','2023-01-12'],'values':[8,12]}) frame2['dates']=pd.to_datetime(frame2['dates']) frame2=frame2.set_index('dates')
单独对每个DataFrame执行asfreq('D').interpolate()可以正常完成每日插值:
frame1.asfreq('D').interpolate() frame2.asfreq('D').interpolate()
将两个DataFrame合并为['frame','dates']的多索引结构后:
frame1['frame']='f1' frame2['frame']='f2' concat=pd.concat([frame1,frame2]) concat=concat.set_index('frame',append=True) concat=concat.reorder_levels(['frame','dates'])
尝试直接分组插值时触发TypeError:
concat.groupby('frame').apply(lambda g:g.asfreq('D').interpolate())
错误信息:
TypeError: Cannot convert input [('f1', Timestamp('2023-01-01 00:00:00'))] of type <class 'tuple'> to Timestamp
错误原因
groupby('frame')后返回的子组g仍保留原多索引(['frame','dates']),而asfreq('D')要求索引为单日期类型,无法识别元组格式的多索引值,因此报错。
解决方法
在apply的处理逻辑中,先移除子组里多余的frame索引层级,仅保留dates作为单索引执行插值,之后再恢复多索引结构:
result = concat.groupby('frame').apply( lambda g: g.reset_index(level='frame', drop=True).asfreq('D').interpolate() ).reset_index().set_index(['frame', 'dates'])
代码说明
reset_index(level='frame', drop=True):移除子组中的frame索引层,只保留dates作为单索引,满足asfreq的要求- 执行
asfreq('D').interpolate()完成每日插值 - 最后通过
reset_index().set_index(['frame', 'dates'])重新构建多索引,恢复原数据的层级结构
执行后即可得到每个分组内按日期补全并插值的结果。
内容的提问来源于stack exchange,提问作者principal-ideal-domain
相关产品推荐
相关产品推荐

