使用python的pandas包查询数据库数据导出到excel

2023-11-11

前言

前几天接到一个业务的需求,让我把当前数据库里面的结果数据导出到excel中,然后供业务查看。问题是当前结果数据都是列式表,所以需要把数据做一个行列转换,但是业务还有一个需求,要求不同分类的数据展示不同的列并且需要导出到不同的sheet中。没办法,只能去思考怎么实现。
#博学谷IT学习技术支持#

数据大概长这样:

id category key value
id1 分类1 属性1
id2 分类1 属性5
id3 分类2 属性2
id4 分类2 属性3
id5 分类3 属性1
id6 分类4 属性4

1.实现分析

方案一 建立一张大宽表
首先第一想到的是建立一张大宽表,把所有的属性都建上去,然后一把行列转换,把值都转换上去。最后把这个表的数据导出到excel上面。跟业务说了这个方法,他们表示不爽,这么宽的excel(大概600列)我怎么看呢,况且不给我分类,而且列里面肯定有很多的空值,因为不同的分类的属性都不一样。所以这个方法pass。

方案二 建立多张表
没办法,第二想到的是按照不同分类建不同的表,不同表里的字段不一样,跟分类的属性一致。然后写一个存储过程,循环不同的分类查出数据行列转换插入数据到不同的表中,然后把表的数据导出到excel中。但是我一数大概几百个分类,也就是说我要建几百张表,然后导出excel,算了还是作为备选方案。

方案三 使用脚本实现
这种情况我感觉只能写脚本,由于本人python只会helloworld,于是就去查资料,终于找到两个包:pandas、psycopg2。
了解到pandas是python数据分析的应用最广泛的包,然后psycopg2可以用来连接pg数据库。有了这两个包,然后业务逻辑写一下不就是我要的功能么。

2.实现过程

2.1安装环境

1.下载Anaconda,直接搜索官网:https://www.anaconda.com/,下载安装包,然后直接点击下一步,所有勾选项全部勾上,直到结束。这样之后,anaconda就会帮我们装好了python环境,conda包管理工具,最重要的是它帮我们装好了一大堆数据分析工具包,包括pandas。
2.然后打开电脑命令行cmd,输入pip install psycopg2,装好pg连接驱动包
备注:如果想新建一个环境,可以使用:conda create -n python36 python=3.6命令新建一个python环境,然后activate python36命令切换到这个环境下,安装包。

2.3功能逻辑

1.psycopg2连接pg数据库

class ADBPGClient(object):
    def __init__(self, url, db, usr, pwd):
        self._client = psycopg2.connect(
            database=db
            , user=usr
            , password=pwd
            , host=url
            , port="5432"
        )
        self._cursor = self._client.cursor()

    def query(self, sql):
        self._cursor.execute(sql)
        re_query = self._cursor.fetchall()
        self._cursor.close()
        return re_query

    def close(self):
        self._client.close()

2.pandas行列转换

        conn = psycopg2.connect(conn_string)
        df = pd.read_sql(pg_sql, conn)
        dt = pd.pivot(df,index="id",columns="key",values="value")

3.pandas生成excel

dt.to_excel(writer, sheet_name=unicode(sheetname, "utf-8"))

2.4完整代码

有了上面的功能代码,只需要一个循环即可实现需求,循环分类,然后查询出table_result的不同分类的结果,不同的查询结果做一个行列转换然后写入到excel的不同sheet页中即可。

# coding=utf-8
import pandas as pd
import psycopg2


class ADBPGClient(object):
    def __init__(self, url, db, usr, pwd):
        self._client = psycopg2.connect(
            database=db
            , user=usr
            , password=pwd
            , host=url
            , port="5432"
        )
        self._cursor = self._client.cursor()

    def query(self, sql):
        self._cursor.execute(sql)
        re_query = self._cursor.fetchall()
        self._cursor.close()
        return re_query

    def close(self):
        self._client.close()


if __name__ == "__main__":
    """链接ADBPG使用的参数"""
    pg_url = "主机名称"
    pg_usr = "用户"
    pg_pwd = "密码"
    pg_db = "数据库"
    postgres_port = "5432"
    pg_cli = ADBPGClient(pg_url, pg_db, pg_usr, pg_pwd)
    pg_sql = "select distinct category from  table_result;"
    pg_re = pg_cli.query(pg_sql)
    pg_cli.close()
    i = 0
    writer = pd.ExcelWriter(u"汇总数据.xlsx")
    for category in pg_re:
        categoryStr = category[0] + ""
        pg_cli = ADBPGClient(pg_url, pg_db, pg_usr, pg_pwd)
        pg_sql = "select id,category ,key,value from  table_result where category ='{0}' order by id;".format(
            categoryStr)
        conn_string = "host=" + pg_url + " port=" + postgres_port + " dbname=" + pg_db + " user=" + pg_usr + " password=" + pg_pwd
        conn = psycopg2.connect(conn_string)
        df = pd.read_sql(pg_sql, conn)
        dt = pd.pivot(df,index="id",columns="key",values="value")
        sheetname = str.replace(categoryStr,"/","-")
        dt.to_excel(writer, sheet_name=unicode(sheetname, "utf-8"))
        i = i + 1
        print i
    writer.save()

3.总结

有时候使用sql去做一些循环、迭代等逻辑或者动态列查询的需求不太好实现,这时候使用python的数据分析包去做就会简单很多,所以数据开发还是得学习下python。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python的pandas包查询数据库数据导出到excel 的相关文章

  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 如何返回 cost, grad 作为 scipy 的 fmin_cg 函数的元组

    我怎样才能使 scipy 的fmin cg使用一个返回的函数cost and gradient作为元组 问题是有f对于成本和fprime对于梯度 我可能必须执行两次操作 非常昂贵 grad and cost被计算 此外 在它们之间共享变量可
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型

随机推荐

  • Windows Cluster 分布式算法

    在分布式系统中 都需要解决分布式一致性问题 那么 在Windows 集群中 使用了什么算法来保证集群的一致性呢 Paxos Windows Server 故障转移集群 WSFC 使用 Paxos 算法在整个系统中同步更改 通过记录 Paxo
  • 计算机四级网络考试容易蒙吗,计算机四级网络工程师通过率有多少

    计算机四级网络工程师通过率怎么样 我们都知道计算机四级网络工程师非常的难考 所以想大概知道下通过率是怎样的 给自己保个底 所以下面就由小编来给大家说说计算机四级网络工程师通过率是怎么样的吧 欢迎大家前来阅读 计算机四级网络工程师通过率 计算
  • C++宏定义

    define是C语言中提供的宏定义命令 其主要目的是为程序员在编程时提供一定的方便 并能在一定程度上提高程序的运行效率 用处 define命令是C语言中的一个宏定义命令 它用来将一个标识符定义为一个字符串 该标识符被称为宏名 被定义的字符串
  • Servlet[搭建web开发环境,将项目部署到服务器、创建web程序]

    目录 web开发环境搭建 创建web后端项目并部署到服务器的步骤 创建web后端程序 如何搭建后端服务器 如何开发后端服务器程序 实现前后端交互 开发第一个web应用程序 什么是服务器 广义上的服务器 计算机硬件 计算机软件 狭义上的服务器
  • docker镜像的导出与导入

    内网干活的忧桑大概就是偷点懒 使用docker镜像 dockerfile中使用的镜像内网中却没法down下来 so 找个外网机 先把需要的镜像下载下来 再将下载好的镜像载入到内网机 通过查资料 docker镜像的导入导出命令有save lo
  • 前端组件Bootstrap4(学习笔记一)

    Hello 大家好 今天要分享的文章仍然是关于前端的 为什么迟迟没有关于Android相关的文章呢 其实这个公众号一开始 我就有明确的表示 它不仅仅局限于Android 我希望它可以博采众长 以Android为主 其它技术为辅 夹杂一些社会
  • Unity3D之UI按键绑定事件案例(七)

    七 多个按键事件存在的时候怎么区分 怎么同时绑定事件 下面的案例可以给出答案 第一步 通过Hierarchy面板创建多个button 第二步 创建一个名为Buttons的脚本 代码如下 public class MyEventArgs pu
  • web前端可视化开发,前端优秀实践指南,知乎上已获万赞

    前言 跳槽 这在 IT 互联网圈是非常普遍的 也是让自己升职加薪 走上人生巅峰的重要方式 那么作为一个普通的Android程序猿 我们如何才能斩获大厂offer 呢 疫情向好 面试在即 还在迷茫踌躇中的后浪们 如何才能在面试中让自己脱颖而出
  • Qt自定义控件 —— 颜色选择组合控件

    在开始阅读本文之前 如果您有学习创建Qt自定义控件并在其他项目中引用的需求 请参考 Linux系统下在Qt Creator中创建自定义控件并在其他项目中引用https blog csdn net YMGogre article detail
  • head 请求了解过吗?如何用 get 模拟 head 请求?不需要服务器返回数据,怎么实现?

    HEAD请求是HTTP 1 1协议中定义的一个请求方法 与GET请求相似 但只请求目标URL的头部 不请求实际的数据或者说正文内容 其主要用途是 检查资源是否被修改 检查资源是否存在 校验缓存有效性 了解服务器性能 要用GET请求模拟HEA
  • [已解决]“ImportError: No module named flask”

    1 删除原有的用大写开头的Flask插件 pip uninstall Flask 2 yum安装 flask yum install python flask 3 等待安装完成就可以允许程序啦 100 有用
  • 快速编写json数据

    1 打开idea 2 新建txt文件 alt 单击快速加 编写json数据
  • C语言面试必问的经典问题(纯”gan“货)

    C语言面试必问的经典问题 1 预处理 1 预编译 编译过程最先做的工作是啥 何时需要预编译 指令有什么 答 预编译就是预处理 就是把一些文本的替换工作工作 预编译指令 include ifdef ifndef else endif 编译 字
  • 高德地图Js API的使用

    申请JSAPI的开发者key 申请地址 http lbs amap com dev key 引入高德地图JavaScript API文件 创建地图容器 在页面body里你想展示地图的地方创建一个div 容器 并指定id标识 div div
  • Python-Pyqt6之QIntValidator,QDoubleValidator无法限制数值范围的正则表达式解决方案

    在使用Pyqt6进行GUI设计的时候 在需要输入数值 整型 浮点型 的时候选择使用了QLineEdit这个组件控件 详情介绍 QLineEdit组件详情 QLineEdit自带的setValidator包含 QIntValidator QD
  • promise函数几种写法与坑

    promise是ES6中引入的处理异步函数的强大特性 但是对promise的不恰当使用可能会达不到最终目的 对这个问题的探究来源于这篇文章关于promises 你理解了多少 几个异步函数如下 resolve或reject在回调函数里被调用
  • 网络编程的几种I/O模式

    1 非阻塞I O 非阻塞I O 若想网络编程时调用I O函数不想让程序阻塞 需要使用I O复用技术 一个方法是poll 轮询 所谓轮询就是执行函数时 如果内核不能立即对应用的函数进行响应时 就返回给应用一个错误 而应用不停的循环调用该函数
  • JavaScript表示不背小数计算存在误差的锅

    浮点数的最高精度是17位小数 但是在实际计算时会产生莫名其妙的问题 如0 1 0 2的结果不是0 3 而是0 30000000000000004 这个舍入误差会导致无法测试特定的浮点数值 例如 var a 0 1 b 0 2 if a b
  • 【数据结构】采用邻接矩阵表示法创建无向网、无向图、有向图、有向网

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 一 无向网 权值 对称 1 思路 2 代码 3 运行结果 三 其他 1 无向图 0 1 对称 2 有向网 权值 不对称 3 有向图 0 1 不对称 一 无向网 1 思路
  • 使用python的pandas包查询数据库数据导出到excel

    文章目录 前言 1 实现分析 2 实现过程 2 1安装环境 2 3功能逻辑 2 4完整代码 3 总结 前言 前几天接到一个业务的需求 让我把当前数据库里面的结果数据导出到excel中 然后供业务查看 问题是当前结果数据都是列式表 所以需要把