python结果批量导出excel(二)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336