读入两张excel表,用pandas的方式,进行业务逻辑处理。
目标
1.将两个Excel文件读入,
2.用pandas实现对标内数据的类SQL查询,
3.对满足业务需求的数据结果进行业务逻辑验证,
4.存储校验结果,
5.并将结果输出至Excel文件。
主要库及函数
1.pandas 库
2.read_excel、unique、sort_values、itertuples、getattr、list、index。
3.重要特性:
- 对于Dataframe对象,查询完之后,可以用itertuples对其结果按行进行遍历处理。
- 对于Dataframe对象,多次查询之后,其对应的内置index值不会重置,会是一个固定不变的值,这个值在读入Excel时就确定了。
- pandas查询数据,不能直接用SQL实现时,可以通过将SQL的子语句拆解成多步的方式,最终也能实现复杂查询。结合 如: pf . loc[(emplyeeJobDf[“日期”] <= getattr(row, ‘日期’))].sort_values(by=[‘日期’],ascending=[False]).head(1) 等,实现字段筛选,排序,取最大值等,此外,还可以使用max等方法直接返回目标行。
代码部分
import pandas as pd
# 读取excel数据表1,为防止各种格式被处理乱七八糟,统一处理为str
df = pd.read_excel("D:\data\0619.xls", dtype=str)
# 将指定列按照字符串格式读入
# 读取excel数据表2
jobDf = pd.read_excel("D:\data\3222.xls", dtype=str)
# 1.--------------------- 获取ID列表-------------------------------------------
idlist = df["ID"].unique() # id列表去重
# print(len(idlist)) # 待处理人员个数
# 计算结果存贮列表
check_list = []
# 2.---按ID查找某一员工的表1 全部数据,并按生效日期排列------------------------
for emplid in idlist:
emplyeedf = df[(df['ID'] == emplid)].sort_values(by=['日期'], ascending=[True])
# print(emplyeeJobDf.head())
# 初始化基本信息
emplyee_id = emplid # 初始化ID
emplyee_grade = emplyeedf["默认值"][emplyeedf.index.values[0]] # 当前所在dataframe的索引值
emplyee_step = 0
emplyee_score = 0
# 遍历记录,按照事件标志,对状态进行计算和刷新
for row in emplyeedf.itertuples():
#3.-------------------- 获取 表2 数据--------------------------------------------
emplyeeJobDf = jobDf[(jobDf['ID'] == emplid)]
jobresultDF = emplyeeJobDf.loc[(emplyeeJobDf["日期"] <=
getattr(row, '日期'))].sort_values(by=['日期'],ascending=[False]).head(1)
#此处相当于SQL获取最新的满足条件的数据,知识用了pandas的模式
# 依据绩效数据查询生效日期下的职务数据中的级别:此处需要对返回的serise对象转换为list,
#不然不好对值进行逻辑运算。
lastjobGrade = list(jobresultDF["等级"]) # lastjobGrade[0]
lastjobeffdt = list(jobresultDF["日期"])
if lastjobGrade[0] != str(getattr(row, '默认值')):
print(
str(emplid) + " :检测到薪等不匹配:表1 日期:" + str(lastjobeffdt) + "等级为:" +
str( lastjobGrade[0]) + " , 表2 日期为:" + str(getattr(row, '日期')) +
"等级为:" + str(
getattr(row, '默认值')))
#判断逻辑结算 getattr(row, '字段') 各种逻辑处理判断。
if getattr(row, '操作A') == "A":
pass
else:
pass
if getattr(row, '操作B') == "B":
pass
else:
pass
if getattr(row, '操作C') == "C":
pass
else:
pass
check_list.append([A, B, C, D])
#结果存储至list
df = pd.DataFrame(check_list, columns=['A', 'B', 'C', 'D'])
df.to_excel("122334.xlsx", index=False)
#构造表头,输出至Excel。打完收工。