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

Pandas遍历DataFrame时仅保存最后一次迭代数据至Excel的解决问询

解决Excel仅写入最后一行数据的问题

我明白你遇到的麻烦了——每次循环都会覆盖之前的内容,最后只留下最后一次迭代的数据。这是因为你在循环内部重复创建DataFrame和ExcelWriter,每次保存都会覆盖整个文件,而且每次只保存当前行的数据。

问题根源拆解

  • 你在循环里每次都用pd.DataFrame([dataREF.loc[i]])创建只包含当前行的新DataFrame,没有把符合条件的行累加起来
  • 每次循环都初始化pd.ExcelWriter并调用save(),这会清空之前的文件内容,只保留当前循环写入的数据

更高效的解决方案(避免嵌套循环)

其实完全不需要用嵌套循环来遍历行,Pandas本身就有强大的筛选和合并功能,代码更简洁,效率也更高。我们可以这样做:

  1. 先分别筛选两个DataFrame中Power > 0的行
  2. 按照Timestamp列做内连接,只保留两边都存在且Power符合条件的记录
  3. 将结果写入Excel文件,把两个数据集分别放在不同的列位置

修改后的代码如下:

import pandas as pd
import os

os.chdir('C:\\Users\\NIK\\.spyder2\\PythonScripts')

# 读取数据
fileREF = 'FilterDataREF.xlsx'
dataREF = pd.read_excel(fileREF, sheet_name='Sheet1')
filePCU = 'FilterDataPCU.xlsx'
dataPCU = pd.read_excel(filePCU, sheet_name='Ark1')

# 1. 筛选Power大于0的行
filtered_REF = dataREF[dataREF['Power'] > 0]
filtered_PCU = dataPCU[dataPCU['Power'] > 0]

# 2. 按Timestamp做内连接,只保留两边都有的时间戳
common_data = pd.merge(filtered_REF, filtered_PCU, on='Timestamp', suffixes=('_REF', '_PCU'))

# 3. 写入Excel
writer = pd.ExcelWriter('common_data.xlsx', engine='xlsxwriter')
# 将REF的数据写入Sheet1的起始列
filtered_REF.to_excel(writer, sheet_name='Sheet1', index=False)
# 将PCU的数据从第7列开始写入(和你原来的逻辑一致)
filtered_PCU.to_excel(writer, sheet_name='Sheet1', startcol=7, index=False)
writer.save()

如果你坚持要用循环(不推荐,效率低)

如果你一定要用循环的方式实现,需要先初始化空的DataFrame来收集符合条件的行,最后再一次性写入:

import pandas as pd
import os

os.chdir('C:\\Users\\NIK\\.spyder2\\PythonScripts')

fileREF = 'FilterDataREF.xlsx'
dataREF = pd.read_excel(fileREF, sheet_name='Sheet1')
filePCU = 'FilterDataPCU.xlsx'
dataPCU = pd.read_excel(filePCU, sheet_name='Ark1')

# 初始化空的DataFrame用来收集数据
data_REF = pd.DataFrame(columns=dataREF.columns)
data_PCU = pd.DataFrame(columns=dataPCU.columns)

for i in range(len(dataREF)):
    for j in range(len(dataPCU)):
        if dataREF['Timestamp'][i] == dataPCU['Timestamp'][j] and dataREF['Power'][i] > 0 and dataPCU['Power'][j] > 0:
            # 将符合条件的行追加到DataFrame中
            data_REF = pd.concat([data_REF, dataREF.loc[[i]]], ignore_index=True)
            data_PCU = pd.concat([data_PCU, dataPCU.loc[[j]]], ignore_index=True)

# 所有数据收集完成后,一次性写入Excel
writer = pd.ExcelWriter('common_data.xlsx', engine='xlsxwriter')
data_REF.to_excel(writer, sheet_name='Sheet1')
data_PCU.to_excel(writer, sheet_name='Sheet1', startcol=7)
writer.save()

为什么推荐第一种方法?

  • 嵌套循环的时间复杂度是O(n*m),当数据量大的时候会非常慢
  • Pandas的内置函数([]筛选、merge)都是经过优化的,运行效率远超手动循环
  • 代码更简洁,可读性更强,不容易出错

内容的提问来源于stack exchange,提问作者Nicklas Koldkjær

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:24:36