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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:39:06