zoukankan      html  css  js  c++  java
  • pandas excel动态条件过滤并保存结果

    一、概述

    由于业务需求,需要对某个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

    Sheet2

    Sheet3

     

    完整代码如下:

    # !/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)
    View Code

    执行代码,输出:

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

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

    Sheet1

    Sheet2

     

  • 相关阅读:
    使用 Web 服务 为 ECS Linux 实例配置网站及绑定域名
    部署 LAMP
    PHP与MYSQL事务处理
    centos6 yum 安装nginx 不成功解决办法
    5.5版本以上”No input file specified“问题解决
    php访问url的四种方式
    mysql索引总结----mysql 索引类型以及创建
    承诺,项目管理中的大杀器
    什么叫工作到位?
    Java中注解Annotation的定义、使用、解析
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/14142832.html
Copyright © 2011-2022 走看看