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

python结果批量导出excel(二)

作者: Hobbit的理查德 | 来源:发表于2020-03-28 21:18 被阅读0次

    之前用stata 16的putexcel将结果批量导出到excel,考虑到python在自动化办公上有明显优势,因此,试着用python将结果批量导出excel。

    stata结果导入excel-描述统计

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

    本篇介绍卡方检验,描述统计结果批量导出excel。

    一、分析内容

    1. 卡方检验;
    2. 描述统计结果;

    目标:只需要修改字段名,实现卡方检验,描述统计结果批量导出excel。

    二、具体代码

    1. 导入第三方库

    import pandas as pd
    import numpy as np
    import scipy.stats as stats
    

    2. 构造频率分析和交叉分析函数

    此处频率分析函数和交叉分析函数构造和python结果批量导出excel(一)相同。

    #单变量频率分析结果
    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%')) #百分比以%形式呈现
        print(fre)
        return fre
    # 交叉分析结果
    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
    

    3.构造卡方检验函数

    通过构造卡方检验函数,返回结果X2= ,p=,当然,结果呈现形式,可以根据需求自行构造。

    # 卡方检验
    def chi2sqaure_test(df,row,col):
        cross_row=df[row]
        cross_col=df[col]
        crosstable=pd.crosstab(cross_row,cross_col)
        chi2,p,dof,expected=stats.chi2_contingency(crosstable)
        result='X2 = '+format(chi2,'.2f')+' p = '+format(p,'.3f')
        return result
    

    4. 构造交叉分析+卡方检验导出函数

    #多个单变量+交叉分析结果+卡方检验结果在1个sheet中
    def fre_cross_with_chi2test_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]+1
                chi2_re=chi2sqaure_test(df,r,c)
                chi2_result=pd.DataFrame(np.array(['卡方检验:',chi2_re]))
                chi2_result.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row,header=False)
                start_row=start_row+chi2_result.shape[0]+2
                print(start_row)
        
        writer.save()
        writer.close()
    

    5. 构造描述统计函数

    # 修改值,文本转数值
    def replace(df,colls):
        dfreplace=df[colls]
        dfreplace.replace('非常不符合',1 , inplace = True)
        dfreplace.replace('比较不符合',2 , inplace = True)
        dfreplace.replace('一般',3 , inplace = True)
        dfreplace.replace('比较符合',4 , inplace = True)
        dfreplace.replace('非常符合',5 , inplace = True)
        return dfreplace
    
    # 描述统计(样本量,均值,标准差,最小值,中位数,最大值)在1个sheet
    def describe_one_sheet(df, colls,sheetname,writer):
        numls=[]
        meanls=[]
        stdls=[]
        minvaluels=[]
        medianls=[]
        maxvaluels=[]
        for colname in colls:
            col=df[colname]
            num=col.count()
            numls.append(num)
            mean=col.mean()
            meanls.append(mean)
            std=col.std()
            stdls.append(std)
            minvalue=col.min()
            minvaluels.append(minvalue)
            median=col.median()
            medianls.append(median)
            maxvalue=col.max()
            maxvaluels.append(maxvalue)
    
        # meanls=[round(i,2) for i in meanls] #均值保留2位小数
        # stdls=[round(i,3) for i in stdls]#标准差保留3位小数
    
        describe={'题项':colls,
        '样本量':numls,
        '均值':meanls,
        '标准差':stdls,
        '最小值':minvaluels,
        '中位数':medianls,
        '最大值':maxvaluels
        }
    
        stats=pd.DataFrame(describe,columns=['题项','样本量','均值',
            '标准差','最小值','中位数','最大值'])
    
        stats['均值']=stats['均值'].apply(lambda x:format(x,'.2f')) #均值保留2位小数
        stats['标准差']=stats['标准差'].apply(lambda x:format(x,'.3f'))#标准差保留3位小数
    
        stats.to_excel(writer,index=0,sheet_name=sheetname,startrow=0)
        writer.save()
        writer.close()
    

    6. 主函数并调用

    其中,自变量为11个:因变量为:13个

    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] #因变量
        fre_cross_with_chi2test_one_sheet(df,rowls,colls,sheetname='交叉分析',colorder=order,writer=writer)
        dfreplace=replace(df,colls)#修改值,文本转数字
        des_col_name=list(dfreplace.columns.values)
    
        describe_one_sheet(dfreplace,des_col_name,sheetname='描述统计',writer=writer)
    
    main()
    

    三、效果

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

    1. 含卡方检验的交叉分析

    含卡方检验的交叉分析.gif

    2. 描述统计

    描述统计.png

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

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

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

    相关文章

      网友评论

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

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