Py学习  »  Python

python结果批量导出excel(一)

Ressia • 4 年前 • 835 次点击  

之前用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社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56975
 
835 次点击  
文章 [ 1 ]  |  最新文章 3 年前
316064107
Reply   •   1 楼
316064107    3 年前

Traceback (most recent call last): File "G:\python\面向excel编程\集计脚本新.py", line 121, in <module> main() File "G:\python\面向excel编程\集计脚本新.py", line 117, in main fre_one_sheet(df,rowls,sheetname='频率分析',writer=writer) TypeError: fre_one_sheet() got an unexpected keyword argument 'writer'

辛苦大神,报错的原因是?