Pandas中使用派生值更新MultiIndex数据框的问题
问题分析与解决方案
你的核心问题有两个:
join操作返回的是新的DataFrame对象,你没有将结果重新赋值给trajec,所以循环内的操作不会修改原数据- 遍历每个Vehicle_ID的方式效率较低,Pandas的
groupby可以更简洁高效地完成分组计算
方法1:修复循环内的赋值问题
如果坚持用循环,需要将join的结果重新赋值给trajec,或者先收集所有平滑数据,最后一次性合并:
v_ids = trajec.index.get_level_values('Vehicle_ID').unique().values # 初始化空DataFrame存储所有平滑结果 smooth_all = pd.DataFrame() for id in v_ids: ewm_x = trajec.loc[(id,), 'Local_X'].ewm(span=T_pos/dt).mean() ewm_y = trajec.loc[(id,), 'Local_Y'].ewm(span=T_pos_x/dt).mean() smooth = pd.DataFrame({'ewm_y': ewm_y, 'ewm_x': ewm_x}) smooth_all = pd.concat([smooth_all, smooth]) # 最后一次性合并到原数据 trajec = trajec.join(smooth_all)
方法2:使用groupby实现高效分组计算(推荐)
无需循环,直接按Vehicle_ID分组后计算EWM均值,代码更简洁且性能更好:
# 按Vehicle_ID分组,对Local_X和Local_Y分别计算EWM均值 ewm_result = trajec.groupby(level='Vehicle_ID').agg( ewm_x=('Local_X', lambda x: x.ewm(span=T_pos/dt).mean()), ewm_y=('Local_Y', lambda x: x.ewm(span=T_pos_x/dt).mean()) ) # 将计算结果合并到原DataFrame trajec = trajec.join(ewm_result)
代码说明:
groupby(level='Vehicle_ID'):针对MultiIndex的Vehicle_ID层级分组agg方法可以同时指定多列的计算逻辑,并直接重命名结果列- 最后用
join一次性合并所有分组的计算结果,避免循环中的重复操作
补充说明
- 注意确保
T_pos、T_pos_x和dt的数值是合理的,EWM的span参数需要是正数 - 如果原DataFrame的MultiIndex是有序的,
join操作会自动匹配索引,无需额外处理
内容的提问来源于stack exchange,提问作者evan
相关产品推荐
相关产品推荐

