Excel数据读入pandas,模拟SQL的查询思维,对行数据进行逻辑处理后,输出Excel。(实践总结)

读入两张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。打完收工。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值