如何将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
相关产品推荐
相关产品推荐

