为什么Python中DataFrame导出CSV仅保留迭代过程的最后一个值?
问题诊断
- CSV写入模式默认是覆盖模式:
pd.DataFrame.to_csv默认使用w写入模式,每轮迭代调用都会清空之前的文件内容,仅保留最新一次写入的数据,这是只拿到最后一个值的核心原因。 - 存在无效嵌套循环:内层
for i in results循环没有实际作用,每轮仿真步会重复写入4次完全相同的单条数据,属于冗余逻辑。 - 缺少时间维度字段:当前导出逻辑没有记录仿真时间戳,后续无法匹配流量值对应的时间节点。
- 运行效率低:每次迭代都单独创建DataFrame并执行IO写入,频繁操作文件会大幅拖慢程序运行速度。
修复后代码
from pyswmm import Simulation, LidGroups, Nodes from pyswmm.swmm5 import SWMMException import os import pandas as pd output_path = "E:\\VARS_Research\\pyswmm_master\\Test_Model\\Test_Model_Manual" output_csv_file = "node_flow.csv" # 初始化列表存储所有步的结果 all_results = [] with Simulation('Test_model_LID.inp') as sim: nodes = Nodes(sim) # 提前获取节点对象,不需要每次循环重复获取 j1 = nodes["J1"] j2 = nodes["J2"] j3 = nodes["J3"] j4 = nodes["J4"] sim.step_advance(300) for step in sim: current_time = sim.current_time # 单步结果存入列表 all_results.append({ "time": current_time, "j1": j1.total_inflow, "j2": j2.total_inflow, "j3": j3.total_inflow, "j4": j4.total_inflow }) # 所有仿真步结束后统一转DataFrame导出 my_df = pd.DataFrame(all_results) my_df.to_csv(os.path.join(output_path, output_csv_file), index=False, encoding='utf-8-sig')
优化说明
- 提前获取节点对象,避免每轮循环重复查询节点,提升运行效率
- 所有仿真结果先存在内存列表中,全部计算完成后一次性写入CSV,既避免了文件覆盖问题,也降低了IO频率
- 新增时间列,方便后续数据处理时匹配对应仿真时间
- 导出时添加
index=False参数避免输出多余的行索引列,指定utf-8-sig编码保证中文(如果有)可以正常显示
内容的提问来源于stack exchange,提问作者Husnain
相关产品推荐
相关产品推荐

