Pandas 根据dataframe表自动生成word

在填写一些档案的时候,有了如下的数据表,查找其政策就相对来说容易了很多。

如果能够根据表格项目内容,自动生成每一户的情况,能够省去查找政策的时间。因时间紧迫,所以代码没有用类和函数进行优化,未来如果有时间再将其优化。

基本思路:首先将每户享受的政策,按着户编号相同的原则,输出pandas表,再就整个表进行与扶贫手册项目的对应值,分别输出字符串,将所有字符串汇总至一个列表,最终将此列表,每一个元素作为一行输出至word文档。

  1. 将每一户输出为excel(其实可以直接用生成的这个dataframe,这里有点麻烦了)

    import pandas as pd
    
    tablePath = '14-16享受政策.xls'      #数据母表的模板
    name = '户编号'
    filePath = '测试word'    #输出word所在的文件夹
    df = pd.DataFrame(pd.read_excel(tablePath))  # 将数据总表模板 加载
    huNum = df[name].unique()       #看 列 有多少不同的值
    for i in huNum:
        idNum = str(i)
        mask = df[name].isin([idNum])
        littleData = df[mask]               #获得按 户编号分类的每一个dataframe,户编号都相同,人数不同的表,有所有政策
        #print(littleData)
        nameList = littleData['姓名'].unique()
        nameHuzhu = str(nameList[0])
        fileName = filePath+'/'+ nameHuzhu + '.xls'         #构建文件夹名,最终存储为新的xls
        littleData.to_excel(fileName)

    2.根据每一户的dataframe,生成列表,并将其生成word,库是python-docx

import pandas as pd
import os
from docx import Document

filePath = 'Excel'
wordPath = 'word'

for filename in os.listdir(filePath): #读取文件名称
    if filename[-3:] == 'xls':                  #OS系统中,有.DStore这种设置文件,所以可以从文件后缀名来判断是否是需要的文件
        mList = []                          #新建空列表,用来存储一户中所有的信息,都是字符串。后期可以考虑每个元素都是dataframe,用来在html中写列表<li>
        zhengceList = []
        targetPath = filePath + '/' + filename  #构造文件绝对路径
        #print(targetPath)
        zongTable = pd.DataFrame(pd.read_excel(targetPath)) #读取每一个excel
        zongTable = zongTable.fillna(0)             #在读取总表的时候,有些数值为空,这里可以填充为0,或者设定为空值,这里我选择了0
        zongTable=zongTable.reset_index()              #重置索引,将原来混乱的索引重置为0123...
        #print(zongTable)

        huzhuName = filename.split('.',1)[0]    #获取户主姓名,也就是文件的主文件名,也可以由遍历dataframe,取关系为户主的姓名得到
        mList.append('户主姓名:'+ huzhuName)    #信息:户主姓名:XXX

        idList = list(zongTable['身份证号'].unique())   #确定身份证号有几个不同的值,则家庭人口数为几。  这里可以考虑身份证号或者姓名不同的值进行对应,如果数字不一样要弹出警告
        idNum = len((idList))
        mList.append('家庭人口'+str(idNum))

        bornData = str(idList[0])                   #获得户主的身份证号,并将其出生年月提取。 这里写的不太明显了,应该采用遍历的方法,可读性更好
        mList.append('出生时间:%s年 %s月 %s 日' % (bornData[6:10],bornData[10:12],bornData[12:14]))

        fami = str(list(zongTable['家庭情况'])[0])      #获得家庭情况信息,并返回字符串。 其实应该采用家庭情况一整列,判断非零值,然后进行字符串合并的方式,可能更加综合
        if fami!=0:
            mList.append('家庭情况:'+ fami)

        teleNum = str(list(zongTable['电话'])[0])     #获取家庭的电话号码
        mList.append('电话:%s' % teleNum)

        mList.append('识别标准:国家标准')                   #增加两条公共信息
        mList.append('家庭住址:丰宁满族自治县土城镇土城村')

        dibaoList=zongTable['低保共计']         #获得低保列,如果相加大于零,说明是低保贫困户,否则是一般贫困户
        dibaoSum = dibaoList.sum()
        if dibaoSum>0:
            mList.append('贫困户属性:低保贫困户')
        else:
            mList.append('贫困户属性:一般贫困户')

        pinReason = str(list(zongTable['致贫原因'])[0])         #
        bingTable = zongTable[['姓名','疾病种类']]
        for index, row in bingTable.iterrows():             #将疾病种类列的字符串连接,形成疾病的情况,以看是因病致贫还是其他原因
            if row['疾病种类'] != 0:
                if len(str(row['疾病种类']).strip())!=0:
                    mList.append(str(row['姓名'])+':'+str(row['疾病种类']))
                #pass
        #print(mList)

        gengdiMoney = zongTable['18年粮食直补107.7'].sum()
        if float(gengdiMoney)!=0:
            gengArea = float('%.1f' % gengdiMoney/107.7)                #计算国家认定的耕地面积,注意要保留1位小数
            mList.append('耕地面积:'+str(gengArea))

        linArea =zongTable['退耕亩数'].sum()                        #林地面积,就是退耕还林的亩数
        if linArea!=0:
            mList.append('林地面积'+str(linArea))

        peopleTable = zongTable[['姓名','身份证号','与户主关系']]  #遍历每一行,获得家庭中 姓名,身份证号,与户主关系
        for index,row in peopleTable.iterrows():
            mList.append(str(row['姓名'])+'  '+str(row['身份证号'])+'  '+str(row['与户主关系']))    #这里注意要转化为字符串,否则身份证号可能识别为数字

        helpTab = zongTable[['帮扶单位','责任人姓名','帮扶电话']]                       #获得帮扶单位,帮扶责任人姓名以及帮扶电话号码,也要注意转化为字符串
        for index,row in helpTab.iterrows():
            if row['帮扶单位']:
                mList.append('帮扶责任人:'+str(row['责任人姓名'])+'  '+str(row['帮扶单位'])+'  '+str(row['帮扶电话']))

        if float(gengdiMoney)!=0:
            gengArea = float('%.1f' % gengdiMoney/107.7)        #根据粮食直补计算出耕地面积,并格式化补贴
            mList.append('帮扶措施:粮食直补'+'    成效:'+'粮食直补'+str(gengArea)+'亩'+'获得补贴'+str(float('%.2f' % gengdiMoney))+'元')

        linArea = zongTable['退耕亩数'].sum()
        if linArea != 0:                                        #获得退耕还林面积,以及格式化相关补贴内容
            mList.append('帮扶措施:退耕还林'+'  成效:退耕还林' + str(linArea)+'亩,获得补贴'+str(float('%.2f' %zongTable['退耕金额'].sum()))+'元')

        if dibaoSum>0:                              #dibaoList是低保列
            diList = list(zongTable['低保共计']) #[0, 0, 2880, 0]
            realList = [i for i in diList if i !=0]     #[2880, 2880] 删除0元素
            perMonth = dibaoSum/len(realList)/12        #获取低保人数,以及总数额
            mList.append('帮扶措施:最低生活保障政策,申请低保,享受低保政策%d元/人/月,共%d人,    成效:共领取低保金%s元'
                  % (perMonth,len(realList),dibaoSum))

        wujiaSum = zongTable['物价补贴2-5月'].sum()  #物价补贴和电费补贴
        if wujiaSum>0:
            mList.append('帮扶措施:物价补贴,   帮扶成效:领取物价补贴2-5月共计%d元' %wujiaSum)
        eleSum= zongTable['电费补贴1-5月7.8'].sum()
        if eleSum > 0:
            mList.append('帮扶措施:电费补贴,   帮扶成效:领取电费补贴7.8元/月')

        yanglaoList = zongTable[['姓名','养老11月','养老1-11']]
        yanglaoSum = yanglaoList['养老1-11'].sum()
        yanglaoMessage = ''  # 养老每人的信息
        yangNum = 0  # 享受养老人数
        if yanglaoSum>0:
            for index, row in yanglaoList.iterrows():       #养老只有1-11月的,应再加上最后一个月
                if row['养老11月']!=0:
                    yanglaoMessage=yanglaoMessage+'%d元/人/月(%s);' % (row['养老11月'],row['姓名'])
                    yangNum = yangNum+1
            mList.append('帮扶措施:享受社会基本养老保险政策,%s    领取社会基本养老保险共%d元,共%d人'
                                        % (yanglaoMessage,yanglaoSum+row['养老11月'],yangNum))     
                                                #yanglaoSum+row['养老11月'] 是将1-11月 再加一个11月,变为1-12月的养老金

        canjiList = zongTable[['姓名','残疾补贴']]
        canjiSum = canjiList['残疾补贴'].sum()
        canjiName = ''
        if canjiSum>0:
            for index, row in canjiList.iterrows():
                if row['残疾补贴']>0:
                    canjiName = canjiName+row['姓名']+' '
                    mList.append('帮扶措施:享受残疾补助政策%d元/人/月(%s),帮扶成效:共领取残疾补助%d元'
                          %(row['残疾补贴']/12,canjiName,canjiSum))

        houseSum = zongTable['危房补助资金'].sum()
        if houseSum>0:
            houseList = list(zongTable['危房改造方式'])
            houseList = [i for i in houseList if i !=0] #删除0数据
            houseMess = ','.join(houseList)
            mList.append('帮扶措施:危房改造,%s房屋,  帮扶成效:获得危房改造资金%s元,改善居住条件' %(houseMess,houseSum))

        hulinMoney = zongTable['临时护林员2-5月'].sum()
        if hulinMoney>0:
            mList.append('帮扶措施:选聘为临时护林员,    帮扶成效:临时护林员2-5月工资%d元' % hulinMoney)

        workList = zongTable[['姓名','务工单位','务工收入']]
        workGo=''
        workMess = ''
        if workList['务工收入'].sum()>0:
            for index, row in workList.iterrows():
                if row['务工收入']>0:
                    workGo = workGo+row['姓名']+'在'+row['务工单位']+'工作,'
                    workMess = workMess + row['姓名'] +'务工年收入'+str(row['务工收入'])+'元   '
            mList.append('帮扶措施:%s    帮扶成效:%s' %(workGo,workMess))

        jishengList = zongTable['计生奖扶']
        jishengSum = jishengList.sum()
        if jishengSum>0:
            mList.append('帮扶措施:计生奖扶,   帮扶成效:领取计生奖扶金%d元' % jishengSum)

        chongyangList = zongTable[['姓名','重阳慰问']]
        if chongyangList['重阳慰问'].sum()>0:
            for index, row in chongyangList.iterrows():
                if row['重阳慰问']>0:
                    mList.append('帮扶措施:重阳节慰问,  帮扶成效:领取重阳节慰问金%d元' %row['重阳慰问'])



        xueList = zongTable[['姓名', '18春学前资助','18年秋学前资助','18春土城小学寄宿补助',
                             '18年秋土城小学寄宿补助','18年春土城中学寄宿补助','18年秋土城中学寄宿补助']]
        for index, row in xueList.iterrows():
            if row['18春学前资助']!=0:
                mList.append('帮扶措施:享受学前资助政策,  帮扶成效:%s获得18年春学前资助%d元' % (row['姓名'],row['18春学前资助']))
            if row['18年秋学前资助']!=0:
                mList.append('帮扶措施:享受学前资助政策,  帮扶成效:%s获得18年秋学前资助%d元' % (row['姓名'],row['18年秋学前资助']))
            if row['18年秋土城小学寄宿补助']!=0:
                mList.append('帮扶措施:享受两免一补政策,  帮扶成效:免除学杂费、免费提供教科书、%s获得18年秋季学期寄宿补助%d元' % (row['姓名'],row['18年秋土城小学寄宿补助']))
            if row['18年春土城中学寄宿补助']!=0:
                mList.append('帮扶措施:享受两免一补政策,  帮扶成效:免除学杂费、免费提供教科书、%s获得18年春季学期寄宿补助%d元' % (row['姓名'],row['18年春土城中学寄宿补助']))
            if row['18年秋土城中学寄宿补助']!=0:
                mList.append('帮扶措施:享受两免一补政策,  帮扶成效:免除学杂费、免费提供教科书、%s获得18年秋季学期寄宿补助%d元' % (row['姓名'],row['18年秋土城中学寄宿补助']))

        yuluList = zongTable[['姓名','雨露计划']]
        try:
            yuluList['雨露计划'].sum()      #因为雨露计划的列是字符串,如果无法相加,则说明有非零值
        except:
            for index, row in yuluList.iterrows():
                if row['雨露计划']!=0:
                    mList.append('帮扶措施:享受雨露计划政策,   帮扶成效:%s在%s学习,领取雨露计划助学金' %(row['姓名'],row['雨露计划']))


        menzhenList = zongTable[['姓名', '医疗政策(门诊统筹)']]
        menzhenMess = ''
        for index, row in menzhenList.iterrows():
            if row['医疗政策(门诊统筹)'] != 0:
                if '500' in str(row['医疗政策(门诊统筹)']):
                    menzhenMess = menzhenMess + ('%s%s,用于买药;' % (row['姓名'], row['医疗政策(门诊统筹)']))
                else:
                    menzhenMess = menzhenMess + ('%s%s;' % (row['姓名'], row['医疗政策(门诊统筹)']))

        if len(menzhenMess) > 0:
            mList.append('8组先别写!!帮扶措施:医疗政策(门诊统筹),帮扶成效:%s' % menzhenMess)


        doctorList = zongTable[['姓名','总费用','报销']]
        doctorMess =''
        if doctorList['总费用'].sum():
            for index, row in doctorList.iterrows():
                if row['总费用']>0:
                    doctorMess = doctorMess +row['姓名']+'2018年花费'+str(float('%.2f' % row['总费用']))+'元,报销'+str(float('%.2f' % row['报销']))+'元 '
            mList.append('帮扶措施:享受先诊疗后付费政策,提高基本医疗保险、大病保险、医疗救助待遇   帮扶成效:%s' %doctorMess)

        #print(mList)

        wordFilePath = wordPath + '/' + huzhuName+'.docx'  # 构造文件绝对路径
        document = Document()
        #document.add_heading(huzhuName, 0)
        for i in mList:
            document.add_paragraph(i)
        document.save(wordFilePath)

最终在word文件夹里生成了许多的doc文档,同时每个文档内容就是每一户的情况:

 

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limaning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值