You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中使用派生值更新MultiIndex数据框的问题

问题分析与解决方案

你的核心问题有两个:

  1. join操作返回的是新的DataFrame对象,你没有将结果重新赋值给trajec,所以循环内的操作不会修改原数据
  2. 遍历每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:25:34