python结果批量导出excel(一)
2020-03-26 本文已影响0人
Hobbit的理查德
之前用stata 16的putexcel
将结果批量导出到excel,考虑到python在自动化办公上有明显优势,因此,试着用python将结果批量导出excel。
stata结果导入excel-频率分析
stata结果导入excel-交叉分析
stata结果导入excel-多重响应
一、分析内容
- 频率分析;
- 交叉分析;
- 多重响应;
目标:只需要修改字段名,实现频率分析、交叉分析和多重响应结果批量导出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. 频率分析
频率分析.gif2. 交叉分析
交叉分析.gif3. 多重响应
多重响应.pngpython结果批量导出excel(一):频率分析、交叉分析和多重响应
python结果批量导出excel(二):卡方检验,描述统计
python结果批量导出excel(三):组间差异比较(F检验、T检验和事后比较)