循环生成DataFrame写入Excel仅存最后一行,求合并写入方案
解决循环生成DataFrame写入Excel仅保留最后一行的问题
我看了你的代码和问题描述,核心问题出在循环内重复初始化数据容器和Excel写入器,导致每次迭代都会覆盖之前的内容。咱们一步步来修正:
你的代码里的关键问题
writer = pd.ExcelWriter(...)和appended_data = []被放在了for i in x的循环内部,每次循环都会重新创建空列表和写入器,之前迭代收集的数据直接丢失- 每次循环都调用
writer.save(),这会直接覆盖整个Excel文件,最后只剩最后一次循环的内容 - 内部循环
for j in feature_num其实是在遍历DataFrame的列名,而不是你想要的行内数据,这会导致feature_name取数错误
修正后的代码
import pandas as pd def CCC_90(df_1, x): # 1. 提前初始化全局的DataFrame容器,放在循环外面 appended_data = [] for i in x: print('------------------------------------------------------------------------------------------------------------------- ') feature_num = df_1.iloc[[i]] # 取第i行的DataFrame feature_num_correct = feature_num + 21 print(feature_num_correct) # 2. 遍历feature_num_correct的行数据,转换为一维数组后取对应feature_name for val in feature_num_correct.values.flatten(): feature_name = dfFeaturename.iloc[[val]] appended_data.append(feature_name) # 3. 所有循环结束后,统一合并DataFrame,忽略原有索引避免混乱 merged_df = pd.concat(appended_data, ignore_index=True) # 4. 最后一次写入Excel,使用with语句自动处理文件关闭与保存 with pd.ExcelWriter('No3_dVSa.xlsx', engine='xlsxwriter') as writer: merged_df.to_excel(writer, sheet_name='Sheet1', startrow=1)
关键修改点说明
- 把数据容器和写入器移到循环外:确保所有迭代的DataFrame都能被收集到同一个列表里,不会被每次循环重置清空
- 统一合并与写入:等所有数据都收集完成后,一次性合并成一个大DataFrame,再写入Excel,彻底避免覆盖问题
- 修正内部循环的遍历逻辑:用
values.flatten()把feature_num_correct的行数据转成一维数组,确保能正确取到每个值对应的feature_name - 使用with语句管理ExcelWriter:更安全规范,会自动处理文件的关闭和保存,不用手动调用
writer.save()
这样修改后,所有循环生成的DataFrame都会被合并成一个整体,一次性写入Excel,就不会出现只保留最后一行的问题了。
内容的提问来源于stack exchange,提问作者Michael Moran
相关产品推荐
相关产品推荐

