Python循环生成反射率数据存CSV出现阶梯状问题求助
问题分析与解决方案
核心问题
你现在的代码把CSV保存逻辑放在了内层的波长循环里,每计算一个波长的反射率就保存一次。此时R_list是逐步累加的,每次转置后写入的是长度不断增加的行,叠加起来就形成了阶梯状格式。另外df.transpose()没有赋值,相当于白调用了一次。
修改方案
- 调整保存时机:等当前
d_list对应的所有波长反射率计算完成(内层循环结束后),再将完整的R_list转置成一行写入CSV。 - 优化重复操作:
lambda_list是固定的,不需要每次外层循环都重新生成,放在外层循环外即可。 - 修正转置赋值:转置后要重新赋值给变量,否则不会生效。
修改后的完整代码
import numpy as np import pandas as pd import os # 假设你已经定义了Si02_n_fn、Cr_nk_fn、Al_nk_fn、coh_tmm这些函数 # 固定生成一次波长列表,避免重复计算 lambda_list = np.linspace(350, 821, 471) # in nm # 初始化文件是否存在的标记,避免每次都检查文件 file_exists = os.path.exists('Reflectivity.csv') for i in range(0, 11): d_list = [float('inf'), 70+i, 5, 90, 100, float('inf')] # in nm R_list = [] # 内层循环:计算当前d_list对应的所有波长反射率 for lambda_vac in lambda_list: n_list = [1, Si02_n_fn(lambda_vac), Cr_nk_fn(lambda_vac), Si02_n_fn(lambda_vac), Al_nk_fn(lambda_vac), 1.5] R_list.append(coh_tmm('p', n_list, d_list, 0, lambda_vac)['R']) # 内层循环结束后,处理并保存完整的一行数据 df = pd.DataFrame(R_list, columns=['R_list']) transposed_df = df.transpose() # 转置后赋值给新变量 if not file_exists: transposed_df.to_csv('Reflectivity.csv', index=False, mode='w', encoding='utf-8') file_exists = True # 标记文件已创建,后续直接追加 else: transposed_df.to_csv('Reflectivity.csv', index=False, mode='a', encoding='utf-8', header=False)
额外优化建议
如果数据量较大,建议先把所有R_list收集到一个大的DataFrame里,最后一次性保存,减少文件IO操作:
import numpy as np import pandas as pd import os lambda_list = np.linspace(350, 821, 471) all_results = [] for i in range(0, 11): d_list = [float('inf'), 70+i, 5, 90, 100, float('inf')] R_list = [] for lambda_vac in lambda_list: n_list = [1, Si02_n_fn(lambda_vac), Cr_nk_fn(lambda_vac), Si02_n_fn(lambda_vac), Al_nk_fn(lambda_vac), 1.5] R_list.append(coh_tmm('p', n_list, d_list, 0, lambda_vac)['R']) all_results.append(R_list) # 将所有结果转置后保存,每行对应一个d_list的结果 final_df = pd.DataFrame(all_results).transpose() final_df.to_csv('Reflectivity.csv', index=False, encoding='utf-8')
内容的提问来源于stack exchange,提问作者Kim Jae Kyoung
相关产品推荐
相关产品推荐

