如何向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
相关产品推荐
相关产品推荐

