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