循环仅保存最后一个DataFrame至CSV,如何保存每个迭代的DataFrame?
问题排查与解决方案
核心问题分析
数据累加导致重复处理历史内容
两段代码里,每次循环都把当前迭代的i追加到inverterdata列表,再基于整个列表生成invdata。这意味着每一轮生成的data2都会包含之前所有迭代的数据,而非当前单次迭代的独立结果——如果最后统一保存,自然只会得到最后一次包含全部历史的DataFrame。第二段代码存在未定义变量错误
第二段代码直接使用了hh变量,但没有定义hh = data.explode('1.telemetries')这一行,运行时会直接抛出NameError: name 'hh' is not defined,根本无法执行完成。缺少单次迭代的CSV保存逻辑
两段代码都没有在每次迭代时调用to_csv保存当前的data2,如果只是最后合并final列表再保存,当然只会生成一个包含所有数据的CSV,而非每个迭代单独一个文件。
修正后的代码示例
场景1:每次迭代保存独立CSV文件
如果需要为每个迭代生成单独的CSV文件,可以这样修改:
import pandas as pd import json # 假设name和invertersinfo已提前定义 for idx, (inv_id, inv_info) in enumerate(invertersinfo.items()): # 直接处理当前单次迭代的数据,无需累加历史 invdata = pd.DataFrame([[inv_id, inv_info]]) data = pd.json_normalize(json.loads(invdata.to_json(orient="records"))) hh = data.explode('1.telemetries') data2 = pd.json_normalize(json.loads(hh.to_json(orient="records"))) data2 = data2.drop(['1.count', '0'], axis=1) data2.columns = [col.replace('1.telemetries.', '') for col in data2.columns] data2.columns += "_" + name # 用迭代索引+设备ID区分文件名,避免覆盖 data2.to_csv(f'inverter_data_{idx}_{inv_id}.csv', index=False)
场景2:合并所有迭代数据后保存到单个CSV
如果需要把所有迭代的DataFrame合并成一个文件保存:
import pandas as pd import json final = [] for inv_id, inv_info in invertersinfo.items(): invdata = pd.DataFrame([[inv_id, inv_info]]) data = pd.json_normalize(json.loads(invdata.to_json(orient="records"))) hh = data.explode('1.telemetries') data2 = pd.json_normalize(json.loads(hh.to_json(orient="records"))) data2 = data2.drop(['1.count', '0'], axis=1) data2.columns = [col.replace('1.telemetries.', '') for col in data2.columns] data2.columns += "_" + name final.append(data2) # 合并所有DataFrame并保存 combined_df = pd.concat(final, ignore_index=True) combined_df.to_csv('all_inverter_data.csv', index=False)
关键修正点
- 移除了
inverterdata的累加逻辑,每次仅处理当前迭代的单条数据,避免重复生成包含历史的DataFrame。 - 修复了
hh变量未定义的错误。 - 添加了明确的CSV保存逻辑,根据需求选择单次保存或合并后保存。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

