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

如何向Pandas DataFrame追加数据并格式化为指定轨迹数据结构

解决轨迹数据构建Pandas DataFrame的问题

看起来你在处理多帧轨迹数据时,卡在了如何正确积累同一ID的逐帧数据并生成符合要求的DataFrame上。我帮你梳理下现有代码的问题,再给出可行的方案:

现有代码的核心问题

你当前的dic_car_lists和point_lists的存储逻辑有明显问题:

  • 你把每个轨迹的所有历史坐标列表都作为一个元素追加到dic_car_lists里,这会导致后续无法直接拆分出单帧数据
  • compute函数里用car_d.items()构建DataFrame的方式完全不符合目标结构,items()返回的是(轨迹ID, 对应数据)的键值对,和你需要的每行单帧数据结构不匹配

修正后的实现方案

我们换一种思路:逐帧收集单条轨迹的单帧数据,最后统一整理成DataFrame,这样能自然保持每个轨迹的帧顺序。

步骤1:初始化存储结构

用一个简单的列表直接收集所有单帧数据,避免嵌套结构带来的混乱:

# 初始化空列表,用来存每帧的单条轨迹数据
all_frame_data = []

步骤2:每帧处理时收集数据

在每帧检测到目标后,计算完世界坐标center_pt,直接把当前帧的单条数据(轨迹ID、x、y、frame_idx)追加到列表:

trk = trk.astype(np.int32)
p = np.array([[((trk[1] + trk[3]) / 2, (trk[0] + trk[2]) / 2)]], dtype=np.float32)
center_pt = cv2.perspectiveTransform(p, H)

# 提取当前帧的世界坐标值
x_world = float(center_pt[0][0][0])
y_world = float(center_pt[0][0][1])

# 将当前帧的完整数据追加到总列表
all_frame_data.append({
    'trajectory_id': trk[4],
    'x_world': x_world,
    'y_world': y_world,
    'frame': frame_idx
})

步骤3:生成目标DataFrame

所有帧处理完成后,直接将列表转为DataFrame,再按需排序即可:

import pandas as pd

df = pd.DataFrame(all_frame_data)
# 按轨迹ID和帧号排序,确保数据顺序完全符合预期
df = df.sort_values(by=['trajectory_id', 'frame']).reset_index(drop=True)

可选:保留字典式轨迹存储(方便中间查看)

如果你需要按轨迹ID分组存储中间数据,可以用defaultdict(list),但每帧仅追加单帧数据:

from collections import defaultdict

trajectory_dict = defaultdict(list)

# 每帧处理时
trajectory_dict[trk[4]].append({
    'x_world': x_world,
    'y_world': y_world,
    'frame': frame_idx
})

# 最后统一转为DataFrame
all_data = []
for traj_id, frames in trajectory_dict.items():
    for frame_data in frames:
        all_data.append({
            'trajectory_id': traj_id,
            **frame_data
        })
df = pd.DataFrame(all_data).sort_values(by=['trajectory_id', 'frame']).reset_index(drop=True)

这样生成的DataFrame就完全匹配你给出的示例结构——每个轨迹ID对应多行,每行是该轨迹的一帧数据,frame按递增顺序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:31:14