如何提升DataFrame循环遍历条件筛选追加列表的效率
重叠兴趣点位数据去重需求
- 数据规模:约4万行、52列的Pandas DataFrame,存储存在重叠情况的兴趣点位数据
- 去重规则:过滤重叠的点位记录,仅保留每组匹配条目的最后一条
- 示例数据集:

- 预期输出结果:

规则示例:第一条Track A的条目属于重叠记录,需要被排除。
现有实现代码
df_length = len(df.axes[0]) duplicate_flag = False i = 0 trim_value = 0.005 data = [] for j in range(df_length - 1): for k in range(df_length - 1): if k >= i: if(df.at[i, 'Track'] == df.at[k+1, 'Track'] and df.at[i, 'Asset Name'] == df.at[k+1, 'Asset Name'] and df.at[i, 'Type'] == df.at[k+1, 'Type'] and df.at[i, 'Location From'] >= (df.at[k+1, 'Location From'] - trim_value) and df.at[i, 'Location From'] <= (df.at[k+1, 'Location From'] + trim_value) and df.at[i, 'Location To'] >= (df.at[k+1, 'Location To'] - trim_value) and df.at[i, 'Location To'] <= (df.at[k+1, 'Location To'] + trim_value)): duplicate_flag = True if duplicate_flag == False: data.append(df.iloc[i]) i += 1 duplicate_flag = False data.append(df.iloc[-1]) df2 = pd.DataFrame(data)
现有代码逻辑
代码采用逐行双层遍历的方式实现去重:
- 取当前行,和它下方所有行逐一对比
- 判定为重复的条件:
Track、Asset Name、Type三个字段值完全相等Location From、Location To两个字段和对比行对应字段的差值在trim_value=0.005的容差范围内
- 如果当前行和下方任意一行满足重复条件,就标记当前行为重复行,不保留
- 如果当前行和下方所有行都不满足重复条件,就将当前行追加到结果列表中
- 遍历完成后手动追加最后一行,将结果列表转为新的DataFrame
现存问题
当前代码处理4万行数据时运行耗时极长。虽然已经采用了向列表追加元素而非直接操作DataFrame的优化手段,但性能仍达不到可用标准,需要定位性能瓶颈并获取可落地的优化方案。
内容的提问来源于stack exchange,提问作者Xanthan Gum
相关产品推荐
相关产品推荐

