pandas excel动态条件过滤并保存结果

发布时间:2020-12-23 09:16:41编辑:admin阅读(3020)

    一、概述

    由于业务需求,需要对某个excel数据做查询。其中:

    excel文件名,不固定

    sheet数量,不固定

    过滤条件,不固定

     

    二、分析需求

    针对以上3个条件,都是不固定的。因此需要设计一个配置文件,内容如下:

    # 查询条件,多个条件,用逗号分隔
    where_dict = {
        # excel文件名
        "file_name": "456.xlsx",
        # 过滤条件
        "rules": [
            {
                "sheet_name": "Sheet1",
                "split_rule": ["性别=男", "年龄=21"]
            },
            {
                "sheet_name": "Sheet2",
                "split_rule": ["身高=170"]
            }
        ]
    }

    通过遍历这个字典,就可以了。

     

    三、演示

    先安装模块

    pip3 install pandas openpyxl

     

    现有一个456.xlsx,内容如下:

    Sheet1

    1.png

     

    Sheet2

    1.png

     

    Sheet3

     1.png

     

     

    完整代码如下:

    # !/usr/bin/python3
    # -*- coding: utf-8 -*-
    import pandas as pd
    
    # 查询条件,多个条件,用逗号分隔
    where_dict = {
        # excel文件名
        "file_name": "456.xlsx",
        # 过滤条件
        "rules": [
            {
                "sheet_name": "Sheet1",
                "split_rule": ["性别=男", "年龄=21"]
            },
            {
                "sheet_name": "Sheet2",
                "split_rule": ["身高=170"]
            }
        ]
    }
    
    # 创建新的新的查询结果excel
    with pd.ExcelWriter('result.xlsx') as writer:
        file_name = where_dict['file_name']
        for i in where_dict['rules']:
            # print(i, type(i))
            # 查询条件
            where = ""
            # 打开指定的sheet
            df = pd.read_excel(file_name, sheet_name=i['sheet_name'])
            for j in i['split_rule']:
                # 切割条件
                key, value = j.split('=')
    
                # 判断数值是否为数字
                if value.isdigit():
                    # 拼接查询条件
                    where += "(df.%s==%s) & " % (key, value)
                else:
                    where += "(df.%s=='%s') & " % (key, value)
    
            # 去除末尾的&
            where = where.rstrip('& ')
            print(i['sheet_name'],'条件:',where)
            ret = df[eval(where)]
            # print(ret,type(ret))
    
            # 依次写入sheet
            ret.to_excel(writer, sheet_name=i['sheet_name'], index=False, header=True)


    执行代码,输出:

    Sheet1 条件: (df.性别=='男') & (df.年龄==21)
    Sheet2 条件: (df.身高==170)

     

    它会在当前目录生成result.xlsx,打开,结果如下:

    Sheet1

    1.png

     

    Sheet2

     1.png

     


关键字