Python如何将自定义统计函数每次输出的DataFrame存入同Excel不同工作表
问题修复方案
核心问题定位
- 你编写的
stats函数没有设置返回值,调用后赋值给Water_intake、food_intake的变量实际为None,无法拿到统计结果df2 - 你未将多轮计算得到的统计结果统一存入可遍历容器,导出代码的循环逻辑和工作表命名逻辑错误,导致遍历过程中取到字符串类型值调用
to_excel触发报错
分步修改代码
第一步:修改stats函数,添加返回逻辑
def stats(F1_para1,F2_para2,para3,para4,value): #MEAN,SEM,COUNT msc = df.groupby([F1_para1,F2_para2,para3,para4])[value].agg(['mean','sem','count']) msc.reset_index(inplace=True) #converts any columns in index as columns pd.DataFrame(msc) #TWO-WAY ANOVE AND MULTICOMP df['comb'] = df[F1_para1].map(str) + "+" + df[F2_para2].map(str) mod = ols(value+'~'+F1_para1+'+'+F2_para2+'+'+F1_para1+'*'+F2_para2, data = df).fit() aov = anova_lm(mod, type=2) #mod needs to be the same text as mod (i.e. mod1,mod2) comparison=MultiComparison(df[value], df['comb']) tukey_df = pd.read_html(comparison.tukeyhsd().summary().as_html())[0] r=tukey_df[tukey_df['reject'] == True] # 高版本pandas已弃用append,建议替换为concat:df2 = pd.concat([aov, r], ignore_index=True) df2=aov.append(r) #combines dataframes of aov and r # 新增返回语句 return df2
第二步:将多轮统计结果存入字典(键为工作表名,值为对应统计结果)
# 初始化存储结果的字典 result_dict = {} # 调用函数时将结果存入字典,键直接用因变量名作为后续工作表名 result_dict['Water_intake'] = stats('Time','Drug','Diet','Pre_conditions',value='Water_intake') result_dict['Food_intake'] = stats('Time','Drugs','Diet','Pre_conditions',value='Food_intake')
第三步:修改导出代码,批量写入多工作表Excel
import pandas as pd with pd.ExcelWriter(r"path\statistics.xlsx") as writer: # 遍历字典,键作为工作表名,值作为对应写入的DataFrame for sheet_name, stats_df in result_dict.items(): stats_df.to_excel(writer, sheet_name=sheet_name, index=False) # with上下文会自动保存关闭,不需要手动调用save()
补充注意事项
- Excel工作表名不能超过31个字符,也不能包含
\ / ? * [ ]等特殊字符,命名时需注意 - 若使用pandas 2.0及以上版本,需将原函数中
aov.append(r)替换为pd.concat([aov, r], ignore_index=True)避免弃用报错
内容的提问来源于stack exchange,提问作者user17304179
相关产品推荐
相关产品推荐

