美文网首页python学习笔记
python结果批量导出excel(一)

python结果批量导出excel(一)

作者: Hobbit的理查德 | 来源:发表于2020-03-26 17:25 被阅读0次

    之前用stata 16的putexcel将结果批量导出到excel,考虑到python在自动化办公上有明显优势,因此,试着用python将结果批量导出excel。
    stata结果导入excel-频率分析
    stata结果导入excel-交叉分析
    stata结果导入excel-多重响应

    一、分析内容

    1. 频率分析;
    2. 交叉分析;
    3. 多重响应;

    目标:只需要修改字段名,实现频率分析、交叉分析和多重响应结果批量导出excel。

    二、具体代码

    1. 导入第三方库

    import pandas as pd
    import numpy as np
    

    2. 构造频率分析函数

    #单变量频率分析结果
    def fre(df,c):
        if type(df[c])=='str':
            df[c]=df[c].apply(lambda x:x.strip()) #去除空格
        fre=df.groupby(c)[c].count().sort_values(ascending=False).reset_index(name='频数') #计数,由高到低
        fre=fre[-fre[c].isin([''])] #删除空值
        fre.loc['总计']=['总计',sum(fre['频数'])] #算总数
        fre['百分比']=fre['频数'].apply(lambda x:x/fre.loc['总计','频数']) #算百分比
        fre['百分比']=fre['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈现
        return fre
    
    # 多个单变量频率分析结果在1个sheet中
    def fre_one_sheet(df,ls,sheetname):
        start_row=0
        for c in ls:
            f=fre(df,c)
            f.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
            start_row=start_row+len(f['百分比'])+2
            writer.save()
            writer.close()
    

    3. 构造交叉分析函数

    # 交叉分析结果
    def cross(df,row,col,colorder=0):
        cross_row=df[row]
        cross_col=df[col]
        total=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合计') #生成交叉频数表
        per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合计',normalize='index') #生成行百分比
        # per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合计',normalize='columns') #生成列百分比
        if colorder:
            total=total[colorder] #修改列的顺序
            per=per[colorder] #修改列的顺序
        per=per.applymap(lambda x:format(x,'.2%')) #百分比以%形式呈现
        summary=pd.merge(total,per,on=row)
        print(summary)
        return summary
    
    #多个单变量+交叉分析结果在1个sheet中
    def fre_cross_one_sheet(df,rowls,colls,sheetname,writer,colorder=0):
        start_row=0
        for c in colls:
            f=fre(df,c)
            f.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
            start_row=start_row+len(f['百分比'])+2
    
            for r in rowls:
                crosstable=cross(df,r,c,colorder)
                crosstable.to_excel(writer,index=1,sheet_name=sheetname,startrow=start_row)
                start_row=start_row+crosstable.shape[0]+2
        writer.save()
        writer.close()
    

    4. 构造多重响应函数

    # 计数
    def col_count(df,colname):
        dic={}
        for d in df[colname]:
            dic[d]=dic.get(d,0)+1
        print(dic)
        return dic
    
    # 多重响应
    def multi(df,mulls,selecttag):
        muldic={}
        for m in mulls:
            muldic[m]=col_count(df,m)[selecttag]
        data={}
        data['选项']=list(muldic.keys())
        data['频数']=list(muldic.values())
        mul=pd.DataFrame(data) #得到频数
        mul['百分比']=mul['频数'].apply(lambda x:x/sum(mul['频数'])) #算百分比
        mul['百分比']=mul['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈现
        mul=mul.sort_values('频数',ascending=False) #降序排序
        print(mul)
        return mul
    
    # 多个多重响应在1个sheet
    def multi_one_sheet(df,varls,sheetname,selecttag,writer):
        start_row=0
        for v in varls:
            mulresp=multi(df,v,selecttag)
            mulresp.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
            start_row=start_row+mulresp.shape[0]+2
        writer.save()
        writer.close()
    

    5. 主函数并调用

    其中,自变量为11个:因变量为:13个;多选题:3道

    def main():
        df=pd.read_excel('data.xlsx') # 数据源
    
        colnamels=list(df.columns.values) #打印出字段的索引和列名,方便检索
        # for i,c in enumerate(colnamels): 
        #     print(i,c)
            
        file_dir='result.xlsx' #输入excel文件
        writer=pd.ExcelWriter(file_dir) #用于追写excel
    
        order=['非常不符合','比较不符合','一般','比较符合','非常符合'] #交叉列的排序
    
        rowls=colnamels[140:151] #自变量
        colls=colnamels[11:24] #因变量
        varls=[colnamels[87:98],colnamels[100:114],colnamels[129:134]] #多选题def main():
        df=pd.read_excel('data.xlsx') # 数据源
    
        colnamels=list(df.columns.values) #打印出字段的索引和列名,方便检索
        for i,c in enumerate(colnamels): 
            print(i,c)
            
        file_dir='result.xlsx' #输入excel文件
        writer=pd.ExcelWriter(file_dir) #用于追写excel
    
        order=['非常不符合','比较不符合','一般','比较符合','非常符合'] #交叉列的排序
    
        rowls=colnamels[140:151] #自变量
        colls=colnamels[11:24] #因变量
        varls=[colnamels[87:98],colnamels[100:114],colnamels[129:134]] #多选题
    
        fre_one_sheet(df,rowls,sheetname='频率分析',writer=writer)
        fre_cross_one_sheet(df,rowls,colls,sheetname='交叉分析',colorder=order,writer=writer)
        multi_one_sheet(df=df,varls=varls,selecttag='勾选',sheetname='多重响应',writer=writer)
    
    main()
    

    三、效果

    将上述代码结合后,大约花费16s的时间将上述分析结果导出excel。

    1. 频率分析

    频率分析.gif

    2. 交叉分析

    交叉分析.gif

    3. 多重响应

    多重响应.png

    python结果批量导出excel(一):频率分析、交叉分析和多重响应

    python结果批量导出excel(二):卡方检验,描述统计

    python结果批量导出excel(三):组间差异比较(F检验、T检验和事后比较)

    相关文章

      网友评论

        本文标题:python结果批量导出excel(一)

        本文链接:https://www.haomeiwen.com/subject/mzgcuhtx.html