You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套字典转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)

优化说明:

  1. 移除exec的使用:直接通过字典构建条目,避免了动态代码执行的潜在风险(比如变量名错误、注入问题),代码可读性也更强。
  2. 灵活扩展变量:通过遍历list_of_variables自动添加数据,后续新增变量只需修改列表,不用重复写代码。
  3. 强制列顺序:构建DataFrame时明确指定列顺序,确保导出Excel的列完全符合你的需求。
  4. 整洁导出:用index=False去掉Excel中多余的行号列,输出更干净。

内容的提问来源于stack exchange,提问作者user2500903

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:39:14