Pandas遍历DataFrame时仅保存最后一次迭代数据至Excel的解决问询
解决Excel仅写入最后一行数据的问题
我明白你遇到的麻烦了——每次循环都会覆盖之前的内容,最后只留下最后一次迭代的数据。这是因为你在循环内部重复创建DataFrame和ExcelWriter,每次保存都会覆盖整个文件,而且每次只保存当前行的数据。
问题根源拆解
- 你在循环里每次都用
pd.DataFrame([dataREF.loc[i]])创建只包含当前行的新DataFrame,没有把符合条件的行累加起来 - 每次循环都初始化
pd.ExcelWriter并调用save(),这会清空之前的文件内容,只保留当前循环写入的数据
更高效的解决方案(避免嵌套循环)
其实完全不需要用嵌套循环来遍历行,Pandas本身就有强大的筛选和合并功能,代码更简洁,效率也更高。我们可以这样做:
- 先分别筛选两个DataFrame中
Power > 0的行 - 按照
Timestamp列做内连接,只保留两边都存在且Power符合条件的记录 - 将结果写入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
相关产品推荐
相关产品推荐

