嵌套字典转Pandas DataFrame并导出Excel的列序/键序设置问题
嘿,我来帮你搞定这两个技术问题,先从列顺序控制说起,再优化你的代码实现导出~
一、控制导出Excel时的列顺序(嵌套字典键序/Pandas列序)
不管是从嵌套字典构建DataFrame,还是最终导出Excel,都有几种可靠的方式固定列的顺序:
方法1:构建DataFrame时直接指定列顺序
当你用pd.DataFrame.from_dict创建DataFrame时,直接通过columns参数定义你想要的列顺序,这是最稳妥的方式,完全不受字典插入顺序或Python版本的影响:# 比如你想要的列顺序是case → WindSpeed → TI → 变量1 → 变量2 df = pd.DataFrame.from_dict(dtb_dict, orient='index', columns=['case', 'WindSpeed', 'TI', 'Mx', 'My'])方法2:创建DataFrame后调整列顺序
如果已经生成了DataFrame,也可以通过重新索引列来调整顺序:desired_order = ['case', 'WindSpeed', 'TI', 'Mx', 'My'] df = df[desired_order]关于嵌套字典的键序
Python 3.7+的字典会保留插入顺序,但为了避免版本兼容或意外修改的问题,不建议依赖字典的自然顺序,手动指定columns参数始终是最可靠的选择。
二、优化代码实现嵌套字典转DataFrame并导出Excel
你原来的代码用了exec,这既不安全也不够优雅,我帮你改成更清晰、更安全的写法,同时兼顾列顺序控制:
import pandas as pd import numpy as np # 假设你已经定义好这些变量:wind_speeds, TIs, Mx_m_3, list_of_variables(比如['Mx', 'My']) dtb_dict = {} counter = 0 for m in [3]: # 如果后续需要扩展m的取值,直接修改列表即可 for column, wind_speed in enumerate(wind_speeds): for row, ti in enumerate(TIs): if not np.isnan(Mx_m_3[row, column]): # 直接构建字典条目,完全替代exec的不安全写法 entry = { 'case': '12', 'WindSpeed': wind_speed, 'TI': ti } # 遍历变量列表,自动添加对应的数据 for var_name in list_of_variables: # 从全局作用域获取对应变量,若在函数内可改用locals() entry[var_name] = globals()[var_name][row, column] dtb_dict[counter] = entry counter += 1 # 构建DataFrame时直接指定列顺序 desired_columns = ['case', 'WindSpeed', 'TI'] + list_of_variables df = pd.DataFrame.from_dict(dtb_dict, orient='index', columns=desired_columns) # 导出到Excel,index=False避免导出多余的行索引 df.to_excel('wind_data_output.xlsx', index=False)
优化说明:
- 移除exec的使用:直接通过字典构建条目,避免了动态代码执行的潜在风险(比如变量名错误、注入问题),代码可读性也更强。
- 灵活扩展变量:通过遍历
list_of_variables自动添加数据,后续新增变量只需修改列表,不用重复写代码。 - 强制列顺序:构建DataFrame时明确指定列顺序,确保导出Excel的列完全符合你的需求。
- 整洁导出:用
index=False去掉Excel中多余的行号列,输出更干净。
内容的提问来源于stack exchange,提问作者user2500903
相关产品推荐
相关产品推荐

