如何在for循环中将多个DataFrame导出至同一Excel工作簿的不同工作表?
问题分析与解决方案
看起来你的代码里有几个关键问题导致无法生成第二个SMA对应的工作表,我来帮你拆解并修正:
1. 无用且干扰的变量赋值
你代码里的instrument=+1和MA=+1完全是多余的——for循环会自动遍历列表中的元素,手动修改循环变量不仅没用,还可能在某些场景下干扰循环逻辑,直接删掉这两行就好。
2. 未重置结果DataFrame
你在循环外初始化了resultsDF,第一个MA(20)循环结束后,这个DF已经存储了两个instrument的数据。当进入第二个MA(50)循环时,你会继续往同一个DF里追加数据,这不仅会导致数据混淆,还可能如果内层循环出现异常,直接终止整个MA循环,导致第二个工作表无法生成。
正确的做法是在每个MA循环的开头重新初始化resultsDF,确保每个MA对应的工作表数据都是独立的。
3. 推荐使用pd.concat替代append
DataFrame.append()已经被官方弃用了,改用pd.concat()更符合当前pandas的最佳实践。
修正后的完整代码
import pandas as pd instrument_list = ["AUD_JPY", "AUD_USD"] # 变量名不要用list,这是Python内置类型 granularity = "D" bar_count = 5000 MA_list = [20, 50] # 使用with语句管理ExcelWriter,自动处理保存和关闭 with pd.ExcelWriter('BT.xlsx') as writer: for MA in MA_list: # 每个MA循环开始时,重新初始化空的resultsDF resultsDF = pd.DataFrame(columns=['instrument', 'Start date', 'End date']) for instrument in instrument_list: # 这里放你的数据计算逻辑,比如获取startDate和endDate的代码 # ...(你的原有计算代码) # 示例模拟数据,你可以替换成真实计算结果 startDate = "2023-01-01" endDate = "2024-01-01" # 用pd.concat替代append new_row = pd.DataFrame({'instrument': [instrument], 'Start date': [startDate], 'End date': [endDate]}) resultsDF = pd.concat([resultsDF, new_row], ignore_index=True) # 将当前MA对应的DF导出到指定工作表 sheet_name = f'Price_Over_SMA{MA}_{granularity}' resultsDF.to_excel(writer, sheet_name=sheet_name, index=False) # 加上index=False可以避免导出索引列
额外建议
- 不要用
list作为变量名,这会覆盖Python的内置list类型,改用instrument_list这类更清晰的名字。 - 使用
f-string格式化工作表名称比format()更简洁易读。 - 加上
index=False可以避免把DataFrame的索引列导出到Excel里,让表格更干净。
这样修改后,代码会为每个MA值生成独立的工作表,每个工作表里包含所有instrument的计算结果,完全符合你的需求。
内容的提问来源于stack exchange,提问作者cadig
相关产品推荐
相关产品推荐

