python学习笔记

python结果批量导出excel(二)

2020-03-28  本文已影响0人  Hobbit的理查德

之前用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检验和事后比较)

上一篇下一篇

猜你喜欢

热点阅读