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

如何用Python Pandas识别轨迹数据的细微差异?

轨迹1与轨迹2的差异排查解决方案

问题背景

需要从CSV数据中找出轨迹1和轨迹2的细微差异,现有方案仅通过对比数据框长度、长度相同时用compare方法,但存在索引对齐、未排除冗余字段等问题,需优化解决逻辑。

现有尝试代码

df = pd.DataFrame(pd.read_csv('Data\traks.csv', delimiter = ';'))

frame1, frame2 = df.loc[df['track'].isin([1])], df.loc[df['track'].isin([2])]

if len(frame2) == len(frame1):
    out = frame1.compare(frame2)
    out.to_csv('Difference.csv', index=False)
else:
    print('The length does not match which is the difference,'
    ,'\n frame length with label 2 = ', len(frame2) 
    ,'\n frame length with label 1 = ', len(frame1)
    ,'\nThe frame with the label 1 took longer to ', len(frame1)-len(frame2))

正确解决思路与实现

核心问题分析

  1. 原始代码未重置索引,若两个轨迹的原始行索引不一致,compare会按索引而非实际记录顺序对齐,导致对比结果错误。
  2. 未排除track列(该列本身就是区分轨迹的标识,不属于需要排查的差异)。
  3. 未考虑轨迹间存在缺失记录的情况(仅通过长度判断,无法定位具体缺失的行)。

优化后的代码实现

import pandas as pd

# 读取CSV,使用原始字符串避免路径转义问题
df = pd.read_csv(r'Data\traks.csv', delimiter=';')

# 拆分轨迹1和轨迹2,重置索引确保行顺序对齐
frame1 = df[df['track'] == 1].reset_index(drop=True)
frame2 = df[df['track'] == 2].reset_index(drop=True)

# 移除track列,排除冗余对比项
frame1 = frame1.drop('track', axis=1)
frame2 = frame2.drop('track', axis=1)

# 第一步:检查轨迹长度是否一致
if len(frame1) != len(frame2):
    print(f"轨迹长度不一致:轨迹1共{len(frame1)}行,轨迹2共{len(frame2)}行")
    
    # 若数据包含唯一标识列(如sequence、timestamp),定位具体缺失的记录
    if 'sequence' in df.columns:
        seq_set1 = set(frame1['sequence'])
        seq_set2 = set(frame2['sequence'])
        print(f"轨迹1独有的记录序列:{seq_set1 - seq_set2}")
        print(f"轨迹2独有的记录序列:{seq_set2 - seq_set1}")
else:
    # 第二步:逐字段对比所有记录的差异
    diff_result = frame1.compare(frame2, keep_shape=True, keep_equal=False)
    if not diff_result.empty:
        print("检测到轨迹间的字段差异:")
        print(diff_result)
        diff_result.to_csv('Difference.csv', index=False)
    else:
        print("两个轨迹的所有字段均无差异")

关键优化点说明

  • 索引重置:通过reset_index(drop=True)确保两个轨迹的行索引从0开始连续,保证compare按记录顺序对齐。
  • 冗余字段移除:删除track列,避免将轨迹标识列为差异项。
  • 缺失记录定位:利用集合运算找出两个轨迹间独有的记录(需数据包含唯一标识列),精准定位缺失行。
  • 完整差异输出:compare方法中keep_shape=True保留所有行的结构,keep_equal=False仅显示存在差异的字段,结果更直观。

内容的提问来源于stack exchange,提问作者Show_man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:42:24