PYTHON PANDAS多条件判断及表格自动化&openpyxl表格样式修改——PYTHON自动化办公

内容简介

本文主要介绍Pandas库下,

df[‘column_name’]

df[df[‘column_name’]须符合的条件,’column_name’]

df[df[‘column_name’]须符合的条件]

df[(df[‘column_name1’]须符合的条件1)

                                   & (df[‘column_name2’]须符合的条件2)

                                   & (df[‘column_name3’]须符合的条件3)

...

,’column_name’]

df[(df[‘column_name1’]须符合的条件1)

                                   & (df[‘column_name2’]须符合的条件2)

                                   & (df[‘column_name3’]须符合的条件3)

...]等格式在快速处理excel和自动化办公的实际用法。

同时介绍通过openpyxl模块更改表格样式。

表格介绍

如下,当前文件夹下有两个工作簿,‘0.Data process automation request‘,和’1.2022税则‘。

打开工作簿’1.2022税则‘,里面有一张表。

打开工作簿‘0.Data process automation request‘,里面有四张表。

‘来源表1-Resolved‘

来源表2-Q&A‘

‘来源表3-FP’

‘模板表’

现有下面的业务要求

表格

列标题

修改内容

来源表1
-Resolved

week

userid

asin

classification

Label

sme_classify_userid

来源表2
-Q&A

asin

sim_issue_alias

前缀

地址

新增此列,值为‘前缀’列+‘sim_issue_alias'列

来源表3
-FP

Title

ShortId

前缀

地址

新增此列,值为‘前缀’列+‘ShortId'列

模板表

asin

复制Resolved表‘ASIN’列到此列

Item_name

不填

GL

不填

product-type

不填

classification

复制‘Resolved’表‘classification’列到此列

tax_title

根据‘classification,找到文件夹里‘2022税则表’

(当前文件夹另一张表,不在此工作簿)

     VLOOKUP对应的中文解释到此列

Label

1.复制‘Resolved’表‘Label’列到此列,

保留’SAMPLE_PICKED'值,其余值替换为空值

2."sme_classify_userid"列如有值:

  则"Label"列显示"UTC",并与"Label"列原有的值以"/"分隔

3."Q&A Link"列如有值:

  则"Label"列显示"Q&A",并与"Label"列原有的值以"/"分隔

4."FP Link"列如有值:

  则"Label"列显示"FP",并与"Label"列原有的值以"/"分隔

sme_classify_userid

复制‘Resolved’表‘sme_classify_userid’列到此列,

替换值’Not Assigned‘为空单元格内容

Q&A Link

根据'asin'列,

   vlookup '来源表2-Q&A'新增列'地址'到此处,空值内容应显示为空单元格

FP Link

根据'asin'列( '来源表3-FP'的‘Title'列),

    vlookup '来源表3-FP'新增列'地址'到此处,空值内容应显示为空单元格

userid

复制‘Resolved’表‘userid’列到此列

week

复制‘Resolved’表‘week’列到此列

从以上可看出,‘模板表’为最终需要产生的表,·其中‘模板表’标紫的列需要从其他表复制过来。‘模板表’标红的列需要从其他表VLOOKUP过来,模板表标橙色的列‘Label’需要根据其他多列的值综合产生。

代码书写如下:

#如文章标题所示,本文主要使用PANDAS库处理数据,用openpyxl修改格式。

所以先导入这两个标准库。

import pandas as pd

import numpy as np

import os

import openpyxl

from openpyxl import load_workbook

from openpyxl.worksheet.table import Table, TableStyleInfo

from openpyxl.styles import Font, Border,Side,PatternFill,colors,Alignment

a = os.getcwd()

os.chdir(r'%s'%a)

#遍历当前目录获得目录下仅为xlsx文档的文件名+后缀名。

下面的这段代码是可以通用来遍历指定目录,得到后缀为xlsx的文档名的。

#遍历当前目录获得目录下仅为xlsx文档的文件名+后缀名

filelist = []

filelist2 = []

for root, dirs,files in os.walk(".",topdown = False):
        for name in files:
                
                str = os.path.join(root,name)
                
                if str.split('.')[-1] == 'xlsx':
                        
                        filelist.append(str)
        
for i in filelist:
        
        name = i.split('\\')[1]
        
        filelist2.append(name)

#获取工作簿里的工作表,将各个工作表复制给对应的变量

使用pd.read_excel(filename,sheet_name)读取工作簿下的表格,当没有sheet_name参数时,默认读取工作簿下第一张表。

  
Resolved = pd.read_excel(filelist2[0],sheet_name = 0)  #对应‘来源-Resolved‘表

QA = pd.read_excel(filelist2[0],sheet_name = 1)        #对应‘来源表2-Q&A‘表

FP = pd.read_excel(filelist2[0],sheet_name = 2)        #对应‘来源表3-FP’表

Module = pd.read_excel(filelist2[0], sheet_name = 3)   #对应‘模板表’表

Principle = pd.read_excel(filelist2[1])                #对应’税则‘表

“””下面集中按照上面的业务要求进行表格处理:

总共分为五步

“””

"""第一步:复制和VLOOKUP Resolved表&Pincile 表需要的列到 Module表。"""

使用pd.merge()连接税则表和‘来源表1-Resolved’表,产生临时表格Resolved2。

使用pd[‘column_name’]格式连接已有列的值到新列,以及复制某列到指定列。

#1:产生中间处理表Resolved2用于左连接Principle表(Resolved2表将不被输出)。  


Resolved2 = pd.merge(Resolved,Principle,on= 'classification',how = 'left')

        #2:QA和FP表增加新列,并拼接两列字符串到新列

QA['地址'] = QA['前缀']+QA['sim_issue_alias']

FP['地址'] = FP['前缀'] + FP['ShortId']

        #3:复制Resolved2需要的列到Module对应的列(列名有不相同)。

Module['asin'] = Resolved2['asin']

Module['classification'] = Resolved2['classification']

Module['tax_title'] = Resolved2['商品名称']

Module['sme_classify_userid'] = Resolved2['sme_classify_userid']

Module['userid'] = Resolved2['userid']

Module['week'] = Resolved2['week']

Module['Label'] = Resolved2['Label']

"""

 第二步:将QA表的'地址'栏根据两表ASIN栏相同的原则复制到MODULE表的'Q&A Link'栏。即Module表左连接上述修改后的QA表。

        方法:因为上面业务要求QA表和FP表新增列均名为‘地址’,直接合并会出现混乱列名的困惑,所以采取产生新的临时表格的处理办法。

             同时合并后的Module表会产生来自QA表,FP表不需要的列,需要删除整列。

        

"""

“”“

需要注意的是,使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法,即直接使用 del 语句。

““‘

#1: 复制QA表产生QA2表为过渡表(QA2表最终将不被输出),新增一列标明为'Q&A地址',将原地址栏复制到这一栏 。

QA2 = QA

QA2['Q&A地址'] = QA2['地址']

        #2: Module左连接中间处理的表格QA2,产生表格Module2。

Module2 = pd.merge(Module,QA2,on= 'asin',how = 'left')

Module2['Q&A Link'] = Module2['Q&A地址']

        #3: 删除中间处理产生的不需要的列。

"""方法:使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法。 """

del QA['Q&A地址']

del Module2['前缀']

del Module2['Q&A地址']

del Module2['地址']

del Module2['sim_issue_alias']

"""

第三步,将FP表的'地址'栏根据两表ASIN栏相同的原则复制到MODULE表的'FP Link'栏。

       

        方法:同理,因为上面业务要求QA表和FP表新增列均名为‘地址’,直接合并会出现混乱列名的困惑,所以采取中间表格处理的办法。"""

“”“

需要注意的是,使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法,即直接使用 del 语句。

““‘

      #1:复制FP表产生FP2表为过渡表,(FP2表最终将不被输出),新增一列标明为'FP地址',将原地址栏复制到这一栏。

FP2 = FP

FP2['FP地址'] = FP['地址']

FP2['asin'] = FP2['Title'] #根据下面表格连接的需求将本表不同的列名改为一致

        #2:第一步处理产生的新表Module2左连接中间处理的表格FP2,产生表格Module3。

Module3 = pd.merge(Module2,FP2,on= 'asin',how = 'left')

Module3['FP Link'] = Module3['FP地址']

        #3:删除中间处理产生的不需要的列。

"""方法:使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法。"""

del FP['FP地址']

del FP['asin']

del Module3['前缀']

del Module3['FP地址']

del Module3['地址']

del Module3['Title']

del Module3['ShortId']

"""

  第四步:替换'sme_classify_userid'列,'Label'列里值为业务要求的对应的值。

       

        方法:使用pandas dataform格式的条件查询,并替换单元格值为对应的值。不适用循环是因为循环的速度会非常慢。

"""

“””

格式为df[df[‘column_name’]判断条件,’column_name’]=需要修改成的值

注意:如果写成df[df[‘column_name’]须符合的条件] = 需要修改成的值

为替换替换所有的列,指明‘column_name’才能替换指定列

“””

     #1:替换'sme_classify_userid'列中值为'Not Assigned'的单元格为空值

Module3.loc[Module3['sme_classify_userid']=='Not Assigned','sme_classify_userid']=np.NaN

        #2:替换'Label'列中值为'SAMPLE_PICKED'的单元格内容为'Audit',其他值为空值

Module3.loc[Module3['Label']=='SAMPLE_PICKED','Label'] ='Audit'

Module3.loc[Module3['Label']!='Audit','Label'] = np.NaN

"""

第五步:根据"Label"列原有值,'sme_classify_userid'列,"Q&A Link"列,"FP Link"列的值,修改"Label"列的值为业务要求的值。

        方法:使用pandas dataform格式的多条件查询,用多个'&'逻辑判断筛选出需要的情况,并将满足情况的"Label"列的值替换为业务要求的值。

       

 注意:条件格式逻辑只能使用'&'符号,不能使用and连接词,并且每个逻辑判断要用()括起来,这样才不会报错。

"""

和第四步不同的是,这里需要多条件判断,格式是

df[(df[‘column_name1’]须符合的条件1)

                                   & (df[‘column_name2’]须符合的条件2)

                                   & (df[‘column_name3’]须符合的条件3)

...

,’column_name’] = 需要修改成的值

"""

#"sme_classify_userid"列如有值,则"Label"列显示"UTC",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            &(pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'UTC'
Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'Audit/UTC'

    
#"Q&A Link"列如有值,则"Label"列显示"Q&A",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'Q&A'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
           'Label'] =  'UTC/Q&A'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True)
            ,'Label'] =  'Audit/UTC/Q&A'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] =  'Audit/Q&A'

#"FP Link"列如有值,则"Label"列显示"FP",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] =  'FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            &(pd.isnull(Module3['Q&A Link'])== False)
                                            &(pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Q&A/FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'UTC/Q&A/FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'UTC/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/UTC/Q&A/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/UTC/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/Q&A/FP'

#保存多个工作表到同一个工作簿

#这里使用的是pd.excelWriter(workbook file link)方法,当输出的workbook_name和既存workbook_name相同时,可覆盖原来已存在的工作簿。


writer = pd.ExcelWriter(r'%s\Result.xlsx'%a)

Resolved.to_excel(writer,sheet_name = '来源表1-Resolved',index = False)

QA.to_excel(writer,sheet_name = '来源表2-Q&A',index = False)

FP.to_excel(writer,sheet_name = '来源表3-FP',index = False)

Module3.to_excel(writer,sheet_name = '模板表',index = False)

writer.save()

#通过openpyxl模块更改表格样式


workbook = load_workbook(r'%s\Result.xlsx'%a)
"""使用load_workbook产生的不适pandas的dataForm格式的数据,
而是excel格式,可通过row索引和column索引定位,表头也和excel一样可以这样被定位出来。表头行索引为0"""


worksheet = workbook['模板表']

GreenFill = PatternFill(fill_type = 'solid',start_color = '00E400')

cols = worksheet.max_column

for j in range(1,cols + 1):
        
        cell = worksheet.cell(row = 1,column = j )#产生单元格对象
        
        cell.fill = GreenFill

workbook.save('Result.xlsx')

workbook.close()

完整代码如下:

import pandas as pd

import numpy as np

import os

import xlsxwriter

import openpyxl

from openpyxl import load_workbook

from openpyxl.worksheet.table import Table, TableStyleInfo

from openpyxl.styles import Font, Border,Side,PatternFill,colors,Alignment

a = os.getcwd()

os.chdir(r'%s'%a)

#遍历当前目录获得目录下仅为xlsx文档的文件名+后缀名

filelist = []

filelist2 = []

for root, dirs,files in os.walk(".",topdown = False):
	for name in files:
                
		str = os.path.join(root,name)
		
		if str.split('.')[-1] == 'xlsx':
                        
			filelist.append(str)
	
for i in filelist:
        
	name = i.split('\\')[1]
	
	filelist2.append(name)

#获取工作簿里的工作表,将各个工作表复制给对应的变量
	
Resolved = pd.read_excel(filelist2[0],sheet_name = 0)  #对应‘来源表1-Resolved‘表

QA = pd.read_excel(filelist2[0],sheet_name = 1)        #对应‘来源表2-Q&A‘表

FP = pd.read_excel(filelist2[0],sheet_name = 2)        #对应‘来源表3-FP’表

Module = pd.read_excel(filelist2[0], sheet_name = 3)   #对应‘模板表’表

Principle = pd.read_excel(filelist2[1])                #对应’税则‘表

"""第一步:复制和VLOOKUP Resolved表&Pincile 表需要的列到 Module表。

           方法:使用pd.merge()连接税则表和‘来源表1-Resolved’表,产生临时表格Resolved2。

              使用pd[‘column_name’]格式连接已有列的值到新列,以及复制某列到指定列。
"""



        #1:产生中间处理表Resolved2用于左连接Principle表(Resolved2表将不被输出)。

Resolved2 = pd.merge(Resolved,Principle,on= 'classification',how = 'left')

        #2:QA和FP表增加新列,并拼接两列字符串到新列

QA['地址'] = QA['前缀']+QA['sim_issue_alias']

FP['地址'] = FP['前缀'] + FP['ShortId']

        #3:复制Resolved2需要的列到Module对应的列(列名有不相同)。

Module['asin'] = Resolved2['asin']

Module['classification'] = Resolved2['classification']

Module['tax_title'] = Resolved2['商品名称']

Module['sme_classify_userid'] = Resolved2['sme_classify_userid']

Module['userid'] = Resolved2['userid']

Module['week'] = Resolved2['week']

Module['Label'] = Resolved2['Label']

"""
        第二步:将QA表的'地址'栏根据两表ASIN栏相同的原则复制到MODULE表的'Q&A Link'栏。

        方法:因为上面业务要求QA表和FP表新增列均名为‘地址’,直接合并会出现混乱列名的困惑,所以采取产生新的临时表格的处理办法。

              同时合并后的Module表会产生来自QA表,FP表不需要的列,需要删除整列
         

"""
"""
需要注意的是,使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,

所以这里采取不会显示原数据的删除列方法,即直接使用 del 语句。

"""


        #1: 复制QA表产生QA2表为过渡表(QA2表最终将不被输出),新增一列标明为'Q&A地址',将原地址栏复制到这一栏 。

QA2 = QA

QA2['Q&A地址'] = QA2['地址']

        #2: Module左连接中间处理的表格QA2,产生表格Module2。

Module2 = pd.merge(Module,QA2,on= 'asin',how = 'left')

Module2['Q&A Link'] = Module2['Q&A地址']

        #3: 删除中间处理产生的不需要的列。

"""方法:使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法。 """

del QA['Q&A地址']

del Module2['前缀']

del Module2['Q&A地址']

del Module2['地址']

del Module2['sim_issue_alias']

"""
        第三步,将FP表的'地址'栏根据两表ASIN栏相同的原则复制到MODULE表的'FP Link'栏。
        
        方法:同理,因为上面业务要求QA表和FP表新增列均名为‘地址’,直接合并会出现混乱列名的困惑,所以采取中间表格处理的办法。"""
"""
需要注意的是,使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,

所以这里采取不会显示原数据的删除列方法,即直接使用 del 语句。

"""

        #1:复制FP表产生FP2表为过渡表,(FP2表最终将不被输出),新增一列标明为'FP地址',将原地址栏复制到这一栏。

FP2 = FP

FP2['FP地址'] = FP['地址']

FP2['asin'] = FP2['Title'] #根据下面表格连接的需求将本表不同的列名改为一致

        #2:第一步处理产生的新表Module2左连接中间处理的表格FP2,产生表格Module3。

Module3 = pd.merge(Module2,FP2,on= 'asin',how = 'left')

Module3['FP Link'] = Module3['FP地址']

        #3:删除中间处理产生的不需要的列。

"""方法:使用df.drop(['column_name',axis = 0],不改变内存,在输入df的时候,会显示原数据,所以这里采取不会显示原数据的删除列方法。"""

del FP['FP地址']

del FP['asin']

del Module3['前缀']

del Module3['FP地址']

del Module3['地址']

del Module3['Title']

del Module3['ShortId']

"""
        第四步:替换'sme_classify_userid'列,'Label'列里值为业务要求的对应的值。
        
        方法:使用pandas dataform格式的条件查询,并替换单元格值为对应的值。不适用循环是因为循环的速度会非常慢。
"""
"""
格式为df[df[‘column_name’]须符合的条件,’column_name’] = 需要修改成的值

注意:如果写成df[df[‘column_name’]须符合的条件] = 需要修改成的值

为替换替换所有的列,指明‘column_name’才能替换指定列
"""




        #1:替换'sme_classify_userid'列中值为'Not Assigned'的单元格为空值

Module3.loc[Module3['sme_classify_userid']=='Not Assigned','sme_classify_userid']=np.NaN

        #2:替换'Label'列中值为'SAMPLE_PICKED'的单元格内容为'Audit',其他值为空值

Module3.loc[Module3['Label']=='SAMPLE_PICKED','Label'] ='Audit'

Module3.loc[Module3['Label']!='Audit','Label'] = np.NaN

"""
        第五步:根据"Label"列原有值,'sme_classify_userid'列,"Q&A Link"列,"FP Link"列的值,修改"Label"列的值为业务要求的值。

        方法:使用pandas dataform格式的多条件查询,用多个'&'逻辑判断筛选出需要的情况,并将满足情况的"Label"列的值替换为业务要求的值。
        
        注意:条件格式逻辑只能使用'&'符号,不能使用and连接词,并且每个逻辑判断要用()括起来,这样才不会报错。

"""


"""
和第四步不同的是,这里需要多条件判断,格式是
df[(df[‘column_name1’]须符合的条件1) 
                                        & (df[‘column_name2’]须符合的条件2)
                                        & (df[‘column_name3’]须符合的条件3)
...
,’column_name’] = 需要修改成的值
"""
 


#"sme_classify_userid"列如有值,则"Label"列显示"UTC",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            &(pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'UTC'
Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'Audit/UTC'

    
#"Q&A Link"列如有值,则"Label"列显示"Q&A",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] = 'Q&A'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
           'Label'] =  'UTC/Q&A'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True)
            ,'Label'] =  'Audit/UTC/Q&A'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== True),
            'Label'] =  'Audit/Q&A'

#"FP Link"列如有值,则"Label"列显示"FP",并与"Label"列原有的值以"/"分隔

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] =  'FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            &(pd.isnull(Module3['Q&A Link'])== False)
                                            &(pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Q&A/FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'UTC/Q&A/FP'

Module3.loc[(Module3['Label']!= 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'UTC/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/UTC/Q&A/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== False)
                                            & (pd.isnull(Module3['Q&A Link'])== True)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/UTC/FP'

Module3.loc[(Module3['Label']== 'Audit')
                                            & (pd.isnull(Module3['sme_classify_userid'])== True)
                                            & (pd.isnull(Module3['Q&A Link'])== False)
                                            & (pd.isnull(Module3['FP Link'])== False),
            'Label'] = 'Audit/Q&A/FP'
            
#保存多个工作表到同一个工作簿
#这里使用的是pd.excelWriter(workbook file link)方法,当输出的workbook_name和既存workbook_name相同时,可覆盖原来已存在的工作簿。

writer = pd.ExcelWriter(r'%s\Result.xlsx'%a)

Resolved.to_excel(writer,sheet_name = '来源表1-Resolved',index = False)

QA.to_excel(writer,sheet_name = '来源表2-Q&A',index = False)

FP.to_excel(writer,sheet_name = '来源表3-FP',index = False)

Module3.to_excel(writer,sheet_name = '模板表',index = False)

writer.save()

#通过openpyxl模块更改表格样式

workbook = load_workbook(r'%s\Result.xlsx'%a) 
                                               """使用load_workbook产生的不适pandas的dataForm格式的数据,
                                               
                                             而是excel格式,可通过row索引和column索引定位,表头也和excel一样可以这样被定位出来。表头行索引为0"""
worksheet = workbook['模板表']

GreenFill = PatternFill(fill_type = 'solid',start_color = '00E400')

cols = worksheet.max_column

for j in range(1,cols + 1):
        
        cell = worksheet.cell(row = 1,column = j ) #产生单元格对象
        
        cell.fill = GreenFill

workbook.save('Result.xlsx')

workbook.close()




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值