首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python每次使用相同的定义函数时,将数据框导出到同一excel文件中的不同excel表中?

python每次使用相同的定义函数时,将数据框导出到同一excel文件中的不同excel表中?
EN

Stack Overflow用户
提问于 2021-11-24 10:29:58
回答 1查看 53关注 0票数 0

我有一个定义的函数,它计算我需要的所有必要的统计数据(例如,双向anova和多重比较)。

代码语言:javascript
代码运行次数:0
运行
复制
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

因此,当我按如下方式使用函数时:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
with ExcelWriter(r"path\statistics.xlsx") as writer:
        for n, df2 in enumerate(df2):
            df2.to_excel(writer,value)
        writer.save()

但是我收到了这个错误:

代码语言:javascript
代码运行次数:0
运行
复制
AttributeError: 'str' object has no attribute 'to_excel'

不确定是否有其他方法来实现同样的目标?

EN

回答 1

Stack Overflow用户

发布于 2021-11-24 10:37:28

当您通过df2进行枚举时,您使用的是df2,它将返回列名,这些列名是字符串而不是df,因此出现错误。您可以通过运行以下命令进行检查:

代码语言:javascript
代码运行次数:0
运行
复制
for n, df2 in enumerate(df2):
     print(n)
     print(df2)

您也没有在for循环中更改df2或调用函数来获取df2。我觉得整件事都需要重写。

首先,您需要在函数的末尾添加return df2,以便在调用df2时实际得到它。

代码语言:javascript
代码运行次数:0
运行
复制
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文档中,您可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
Water_intake = stats('Time','Drug','Diet','Pre_conditions',value='Water_intake') 
food_intake = stats('Time','Drugs','Diet','Pre_conditions',value='Food_intake')

要将这两个导出到不同工作表上的excel,您可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
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循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70094475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档