Pandas导出实时速度数据至CSV仅存单行?求排查解决方法
问题描述
处理动态系统时,速度约束数据存储为n×4矩阵Vd = [v_min, v_max, yaw_rate_min, yaw_rate_max],打印输出示例如下:
-0.02 0.02 -1.83728716 1.83728716 0.02 0.06 -0.36745743 3.30711689 0.04 0.08 -1.1023723 2.57220202 0.06 0.1 -1.46982973 2.20474459 ...
希望导出其中的速度最小、最大值到CSV文件,但使用以下代码仅能得到一行数据:
Vs = [config.min_speed+config.U1, config.max_speed+config.U1, -config.max_yaw_rate, config.max_yaw_rate] Vd = [x[3] - config.max_accel * config.dt, x[3] + config.max_accel * config.dt, x[4] - config.max_delta_yaw_rate * config.dt, x[4] + config.max_delta_yaw_rate * config.dt] # [v_min, v_max, yaw_rate_min, yaw_rate_max] dw = [max(Vs[0], Vd[0]), min(Vs[1], Vd[1]), max(Vs[2], Vd[2]), min(Vs[3], Vd[3])] # 期望是n x 4矩阵,但实际是单次计算的1x4列表 dw_arr = np.array(dw) vMin = dw_arr[:,0] #Minimum velocity data column vMax = dw_arr[:,1] #Maximum velocity data column print(dw_arr) df = pd.DataFrame([vMin, vMax]) df.to_csv('Velocity Data.csv') # 仅保存一行数据
解决建议
1. 核心问题分析
- 数据累积错误:当前代码中
dw只是单次循环计算得到的1个长度为4的列表,没有实现实时数据的累积,所以dw_arr是一维数组(shape=(4,)),而非n×4的二维数组。 - DataFrame构造错误:即使
dw_arr是二维数组,用pd.DataFrame([vMin, vMax])会把vMin和vMax作为两行存入,而非两列对应n行数据。
2. 修正步骤
步骤1:初始化累积容器
在实时收集数据的循环外部,先初始化一个空列表用于存储每一次计算的dw:
import numpy as np import pandas as pd # 初始化累积列表 dw_list = []
步骤2:循环中累积数据
在每次计算dw后,将其添加到dw_list中:
# 假设这部分在实时收集的循环内 Vs = [config.min_speed+config.U1, config.max_speed+config.U1, -config.max_yaw_rate, config.max_yaw_rate] Vd = [x[3] - config.max_accel * config.dt, x[3] + config.max_accel * config.dt, x[4] - config.max_delta_yaw_rate * config.dt, x[4] + config.max_delta_yaw_rate * config.dt] dw = [max(Vs[0], Vd[0]), min(Vs[1], Vd[1]), max(Vs[2], Vd[2]), min(Vs[3], Vd[3])] # 将单次结果加入累积列表 dw_list.append(dw)
步骤3:转换为二维数组并提取目标列
循环结束后,将累积列表转为二维numpy数组,再提取速度的最小、最大值列:
# 转换为n×4的二维数组 dw_arr = np.array(dw_list) # 提取v_min和v_max列 v_min_col = dw_arr[:, 0] v_max_col = dw_arr[:, 1]
步骤4:正确构造DataFrame并导出
用字典或者直接取数组前两列来构造DataFrame,确保每行对应一次实时数据:
# 方法1:用字典构造,指定列名 df = pd.DataFrame({ 'v_min': v_min_col, 'v_max': v_max_col }) # 方法2:直接从dw_arr取前两列,指定列名 df = pd.DataFrame(dw_arr[:, :2], columns=['v_min', 'v_max']) # 导出CSV,index=False避免保存索引列 df.to_csv('Velocity Data.csv', index=False)
3. 额外提示
如果需要在实时收集过程中逐行写入CSV(避免内存占用过大),可以使用mode='a'(追加模式)在每次循环中写入单行:
# 第一次写入时添加表头 header = True # 循环内 dw = [max(Vs[0], Vd[0]), min(Vs[1], Vd[1]), max(Vs[2], Vd[2]), min(Vs[3], Vd[3])] # 只取v_min和v_max row = [dw[0], dw[1]] # 构造单行DataFrame写入 pd.DataFrame([row], columns=['v_min', 'v_max']).to_csv('Velocity Data.csv', mode='a', index=False, header=header) # 后续写入不再添加表头 header = False
内容的提问来源于stack exchange,提问作者bobaBoi108
相关产品推荐
相关产品推荐

