pandas按ID分组计算GPS速度后如何回填至原DataFrame并优化性能
高效实现方案
核心优化逻辑是替换手动循环append的反模式,使用pandas原生groupby.apply的自动合并能力,性能可以提升几十到上百倍。
实现代码
import pandas as pd import numpy as np def add_group_speed(group): if len(group) < 2: group['speed'] = 0.0 else: # 确保你的gps_speed函数返回长度与分组行数一致的数组 group['speed'] = gps_speed(group['Latitude'], group['Longitude'], group['TimeUTC']) return group # 按ID分组处理后自动合并为完整DataFrame result_df = df.groupby('ID', group_keys=False).apply(add_group_speed) # 补充空值填充逻辑,和原有业务逻辑对齐 result_df['speed'] = result_df['speed'].fillna(0)
原方案性能问题原因
DataFrame.append每次调用都会生成全新的DataFrame实例,全量复制已有数据,分组数量越多耗时会呈指数级上升,属于pandas操作的典型反模式。
之前transform调用失败的原因
transform要求每个分组的返回结果长度必须和分组本身的行数一致,你之前定义的ucap_speed_desired函数在分组长度<2时返回的是单个数值0,不是长度为1的序列,因此会触发匹配错误。如果要使用transform,只需修改返回值格式即可,但上述apply方案更简洁不易出错。
内容的提问来源于stack exchange,提问作者DKovar
相关产品推荐
相关产品推荐

