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

如何将Python中MixedLM模型输出导出至Excel?

我太懂这种挫败感了——statsmodels的MixedLM summary看起来规整,但就是没法直接导出Excel,之前踩过同样的坑!问题出在mdf.summary()返回的是格式化文本摘要,不是结构化的DataFrame,所以直接调用.to_excel()或者硬转DataFrame肯定会失败。下面给你一套完整的解决方案,既能导出所有关键结果,还能自动生成唯一文件名避免覆盖:

1. 先搞明白为什么之前的方法行不通

mdf.summary()输出的是Summary对象,本质是用来打印的文本内容,不是带列名和索引的DataFrame结构。所以你得先从这个文本摘要里提取出结构化的表格数据,再进行导出。

2. 提取模型结果为结构化DataFrame

我们可以通过summary的tables属性获取里面的所有表格(比如模型基本信息、系数表、随机效应统计),把它们转成DataFrame:

提取固定效应系数表

这是你最关心的核心结果,对应summary里的系数统计部分:

# 从summary中提取系数表格(第二张表)
coef_data = mdf.summary().tables[1].data
coef_df = pd.DataFrame(coef_data[1:], columns=coef_data[0])

# 把数值列转成float类型,方便Excel里做计算/排序
numeric_cols = ['Coef.', 'Std.Err.', 'z', 'P>|z|', '[0.025', '0.975]']
coef_df[numeric_cols] = coef_df[numeric_cols].astype(float)

提取模型基本信息

如果需要把观测数、组数、收敛状态这些元数据也导出,处理第一张表即可:

model_info_data = mdf.summary().tables[0].data
model_info_df = pd.DataFrame(model_info_data[1:], columns=model_info_data[0])

3. 生成唯一文件名(避免覆盖)

用时间戳是最直观的方式,每次运行都会生成不同的文件名;如果是批量运行场景,也可以用UUID生成完全唯一的标识:

from datetime import datetime

# 方式1:带时间戳的文件名(易读)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f"mixedlm_results_{timestamp}.xlsx"

# 方式2:用UUID生成完全唯一的文件名(适合批量脚本)
# import uuid
# filename = f"mixedlm_results_{uuid.uuid4().hex}.xlsx"

4. 导出到Excel(多Sheet存储更清晰)

用pd.ExcelWriter把不同类型的结果放到不同Sheet里,方便后续查看:

with pd.ExcelWriter(filename) as writer:
    model_info_df.to_excel(writer, sheet_name='Model_Info', index=False)
    coef_df.to_excel(writer, sheet_name='Coefficients', index=False)
    # 可选:导出随机效应结果
    # pd.DataFrame(mdf.random_effects).T.to_excel(writer, sheet_name='Random_Effects')

完整可运行代码

把所有步骤整合起来,直接替换你的模型代码即可:

import pandas as pd
import statsmodels.formula.api as smf
from datetime import datetime

# 你的模型拟合代码
model = smf.mixedlm('y_var ~ gas_prices', dfModel, groups = dfModel['region'])
mdf = model.fit()

# 提取模型信息表格
model_info_data = mdf.summary().tables[0].data
model_info_df = pd.DataFrame(model_info_data[1:], columns=model_info_data[0])

# 提取系数表格并转换数值类型
coef_data = mdf.summary().tables[1].data
coef_df = pd.DataFrame(coef_data[1:], columns=coef_data[0])
numeric_cols = ['Coef.', 'Std.Err.', 'z', 'P>|z|', '[0.025', '0.975]']
coef_df[numeric_cols] = coef_df[numeric_cols].astype(float)

# 生成唯一文件名
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f"mixedlm_results_{timestamp}.xlsx"

# 导出到Excel
with pd.ExcelWriter(filename) as writer:
    model_info_df.to_excel(writer, sheet_name='Model_Info', index=False)
    coef_df.to_excel(writer, sheet_name='Coefficients', index=False)
    # 可选导出随机效应
    # pd.DataFrame(mdf.random_effects).T.to_excel(writer, sheet_name='Random_Effects')

print(f"结果已成功导出至:{filename}")

额外小贴士

  • 如果你的summary里还有其他表格(比如随机效应的统计行),可以用mdf.summary().tables[2]提取,处理方式和系数表一致。
  • 转换数值类型这一步不是必须的,但能让Excel里的数值正常参与计算,避免变成文本格式。
  • 用with语句管理ExcelWriter可以确保文件正确关闭,防止出现权限问题或文件损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:02:44