内容简介
本文主要介绍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 | week | |
userid | ||
asin | ||
classification | ||
Label | ||
sme_classify_userid | ||
来源表2 | asin | |
sim_issue_alias | ||
前缀 | ||
地址 | 新增此列,值为‘前缀’列+‘sim_issue_alias'列 | |
来源表3 | 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()