我有一个定义的函数,它计算我需要的所有必要的统计数据(例如,双向anova和多重比较)。
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]
df2=aov.append(r) #combines dataframes of aov and r
因此,当我按如下方式使用函数时:
Water_intake = stats('Time','Drug','Diet','Pre_conditions',value='Water_intake')
food_intake = stats('Time','Drugs','Diet','Pre_conditions',value='Food_intake')
将anova和multicompaison的统计分析后的输出数据帧组合在一起,形成一个新的数据帧- 'df2‘。“‘Value”是来自主数据帧(代码中的df)的依赖变量的列标题。因此,每次我使用此函数时,如果依赖变量不同于主数据框架(例如,食物摄入量、水摄入量等),统计信息汇总就会导出到df2数据框架中,我希望将其作为单独的工作表保存到“统计”工作簿中。
我已经在这里查看了解决方案:Save list of DataFrames to multisheet Excel spreadsheet
with ExcelWriter(r"path\statistics.xlsx") as writer:
for n, df2 in enumerate(df2):
df2.to_excel(writer,value)
writer.save()
但是我收到了这个错误:
AttributeError: 'str' object has no attribute 'to_excel'
不确定是否有其他方法来实现同样的目标?
发布于 2021-11-24 02:37:28
当您通过df2
进行枚举时,您使用的是df2
,它将返回列名,这些列名是字符串而不是df
,因此出现错误。您可以通过运行以下命令进行检查:
for n, df2 in enumerate(df2):
print(n)
print(df2)
您也没有在for循环中更改df2
或调用函数来获取df2
。我觉得整件事都需要重写。
首先,您需要在函数的末尾添加return df2
,以便在调用df2
时实际得到它。
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]
df2=aov.append(r) #combines dataframes of aov and r
return df2
那么你在问题中的两个函数调用实际上会返回一些东西。要将这些内容添加到excel文档中,您可以执行以下操作:
Water_intake = stats('Time','Drug','Diet','Pre_conditions',value='Water_intake')
food_intake = stats('Time','Drugs','Diet','Pre_conditions',value='Food_intake')
要将这两个导出到不同工作表上的excel,您可以执行以下操作:
writer = pd.ExcelWriter(r"path\statistics.xlsx")
Water_intake.to_excel(writer, sheet_name='Water_intake')
food_intake.to_excel(writer, sheet_name='Food_intake')
writer.save()
这将为您提供一个包含两个工作表的电子表格,每个工作表上包含不同的df2
。我不知道您需要多少这样的函数,也不知道如何为每个函数调用不同的函数,但可能有必要创建一个for循环。
https://stackoverflow.com/questions/70094475
复制相似问题