python結(jié)果批量導(dǎo)出excel(一)

之前用stata 16的putexcel將結(jié)果批量導(dǎo)出到excel,考慮到python在自動(dòng)化辦公上有明顯優(yōu)勢(shì),因此,試著用python將結(jié)果批量導(dǎo)出excel。
stata結(jié)果導(dǎo)入excel-頻率分析
stata結(jié)果導(dǎo)入excel-交叉分析
stata結(jié)果導(dǎo)入excel-多重響應(yīng)

一、分析內(nèi)容

  1. 頻率分析;
  2. 交叉分析;
  3. 多重響應(yīng);

目標(biāo):只需要修改字段名,實(shí)現(xiàn)頻率分析、交叉分析和多重響應(yīng)結(jié)果批量導(dǎo)出excel。

二、具體代碼

1. 導(dǎo)入第三方庫(kù)

import pandas as pd
import numpy as np

2. 構(gòu)造頻率分析函數(shù)

#單變量頻率分析結(jié)果
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='頻數(shù)') #計(jì)數(shù),由高到低
    fre=fre[-fre[c].isin([''])] #刪除空值
    fre.loc['總計(jì)']=['總計(jì)',sum(fre['頻數(shù)'])] #算總數(shù)
    fre['百分比']=fre['頻數(shù)'].apply(lambda x:x/fre.loc['總計(jì)','頻數(shù)']) #算百分比
    fre['百分比']=fre['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
    return fre

# 多個(gè)單變量頻率分析結(jié)果在1個(gè)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. 構(gòu)造交叉分析函數(shù)

# 交叉分析結(jié)果
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='合計(jì)') #生成交叉頻數(shù)表
    per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計(jì)',normalize='index') #生成行百分比
    # per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計(jì)',normalize='columns') #生成列百分比
    if colorder:
        total=total[colorder] #修改列的順序
        per=per[colorder] #修改列的順序
    per=per.applymap(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
    summary=pd.merge(total,per,on=row)
    print(summary)
    return summary

#多個(gè)單變量+交叉分析結(jié)果在1個(gè)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. 構(gòu)造多重響應(yīng)函數(shù)

# 計(jì)數(shù)
def col_count(df,colname):
    dic={}
    for d in df[colname]:
        dic[d]=dic.get(d,0)+1
    print(dic)
    return dic

# 多重響應(yīng)
def multi(df,mulls,selecttag):
    muldic={}
    for m in mulls:
        muldic[m]=col_count(df,m)[selecttag]
    data={}
    data['選項(xiàng)']=list(muldic.keys())
    data['頻數(shù)']=list(muldic.values())
    mul=pd.DataFrame(data) #得到頻數(shù)
    mul['百分比']=mul['頻數(shù)'].apply(lambda x:x/sum(mul['頻數(shù)'])) #算百分比
    mul['百分比']=mul['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
    mul=mul.sort_values('頻數(shù)',ascending=False) #降序排序
    print(mul)
    return mul

# 多個(gè)多重響應(yīng)在1個(gè)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. 主函數(shù)并調(diào)用

其中,自變量為11個(gè):因變量為:13個(gè);多選題:3道

def main():
    df=pd.read_excel('data.xlsx') # 數(shù)據(jù)源

    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') # 數(shù)據(jù)源

    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='多重響應(yīng)',writer=writer)

main()

三、效果

將上述代碼結(jié)合后,大約花費(fèi)16s的時(shí)間將上述分析結(jié)果導(dǎo)出excel。

1. 頻率分析

頻率分析.gif

2. 交叉分析

交叉分析.gif

3. 多重響應(yīng)

多重響應(yīng).png

python結(jié)果批量導(dǎo)出excel(一):頻率分析、交叉分析和多重響應(yīng)

python結(jié)果批量導(dǎo)出excel(二):卡方檢驗(yàn),描述統(tǒng)計(jì)

python結(jié)果批量導(dǎo)出excel(三):組間差異比較(F檢驗(yàn)、T檢驗(yàn)和事后比較)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容