python生成Excel透视表

2023-11-01

        假设你有如下数据:

姓名 科目 成绩
小黑 语文 42
小娜 语文 23
小白 语文 98
小乐 语文 52
小黑 数学 30
小娜 数学 76
小白 数学 47
小乐 数学 73
小黑 英语 63
小娜 英语 83
小白 英语 4
小乐 英语 71

        想生成一个透视表,你肯定要去Excel工具里面操作,但是呢,数据多了可能会出错,所以我们可以借助python提供的 pandas 模块进行透视表生成。

        视频演示

python透视表制作

        话不多说,我们先来看看生成后表格的数据项:

        如上就是pandas生成的 Excel透视表,数据一目了然,看的非常清楚直观,前面两行和第四行是代码生成、便于拥有多个数据时进行区分的,如不需要,可进行删除,ALL是成绩的总和。

下面开始上代码教程

  导入相关的模块:

import os
import pandas as pd
import numpy as np
import tkinter as tk
import tkinter.font as tkFont
from tkinter.filedialog import askdirectory
import tkinter.messagebox
import tkinter.filedialog
from tkinter import ttk
import threading as thr
from tkinter import scrolledtext
import datetime

         然后新建一个GUI界面,并在GUI界面添加如下操作元素:两个输入框和两个按钮,分别用来选择需要操作的Excel表和选择保存的文件夹。还有另外三个输入框与按钮,分别用来选择显示在透视表左边和透视表上方的数据项,以及需要比较的数据项,最后是一个清除输入框内容的按钮和一个生成文件的按钮。

        示例图如下:

         好了,现在开始放代码

import os
import pandas as pd
import numpy as np
import tkinter as tk
import tkinter.font as tkFont
from tkinter.filedialog import askdirectory
import tkinter.messagebox
import tkinter.filedialog
from tkinter import ttk
import threading as thr
from tkinter import scrolledtext
import datetime


window = tk.Tk()
window.title('透视表生成(通用版)')
# 获取屏幕宽高
sw = window.winfo_screenwidth()
sh = window.winfo_screenheight()
# 设置屏幕的宽和高
ww = 600
wh = 500
x = (sw - ww) / 2
y = (sh - wh) / 2
# 根据屏幕宽高来让程序居中
window.geometry("%dx%d+%d+%d" % (ww, wh, x, y))

# 设置字体
fontStyle = tkFont.Font(family="Lucida Grande", size=15)
fontStyleRadio = tkFont.Font(family="Lucida Grande", size=13)
# 应用标题
tk.Label(window, text="透视表生成(通用版)", font=fontStyle).pack()
dataState = ""

ty = 0

# 设置frame容器
frame = tk.Frame(window, padx=3, pady=3)
frame.pack()
frame_left = tk.Frame(frame)
frame_right = tk.Frame(frame)
frame_left.pack(side='left')
frame_right.pack(side='right')


def selectFile():
    if ty == 1:
        tks2()
    global paths
    # 打开文件 设置只能打开xls和xlsx文件
    paths = tkinter.filedialog.askopenfilename(title='打开表格',
                                               filetypes=[("XLSX", ".xlsx"), ("XLS", ".xls"), ("CSV", ".csv")])
    path.set(paths)
    cc = paths.endswith(".xls")
    global toCsv
    # 进行表格数据读取,将第一行数据放入Listbox中进行后续选择
    toCsv = 0
    if cc:
        df = pd.read_excel(paths)
    else:
        c2 = paths.endswith(".csv")
        if c2:
            toCsv = 1
            df = pd.read_csv(paths, encoding='GBK')
        else:
            print("c2 ERROR!")
            df = pd.read_excel(paths, engine='openpyxl')

    labels = list(df.columns)
    xl(labels)
    global ttks
    ttks = scrolledtext.ScrolledText(frame_left, width=30, height=9, font=("宋体", 15))
    ttks.pack(padx=5, pady=10)

    global lb
    lb = tk.Listbox(frame_right, font=fontStyle, width=30, height=9, selectmode=tk.EXTENDED)
    lb.pack(padx=5, pady=10)
    for ite in labels:
        lb.insert('end', ite)
    lb.pack()
    print(paths)
    tks()


def sFile():
    sfi = thr.Thread(target=selectFile, daemon=True, args=())
    sfi.start()


# 如果第二次选择表格,就将ty设置为1,当ty=1时,清空 Listbox 的数据
def tks():
    global ty
    ty = 1


def tks2():
    lb.destroy()
    left1.destroy()
    top1.destroy()
    left1Title.destroy()
    top1Title.destroy()
    ttks.destroy()
    ttks.pack_forget()
    values2_.clear()


global values_
values2_ = []


# 要比较的数据
def lbs3():
    for i in lb.curselection():
        values2_.append(lb.get(i))
    ttks.see(tk.END)
    ttks.insert(tk.END, f'当前选中的数据:{str(values2_)}\n\n')
    ttks.update()


def lbsc3():
    for i in lb.curselection():
        values2_.remove(lb.get(i))
    ttks.see(tk.END)
    ttks.insert(tk.END, f'当前选中的数据:{str(values2_)}\n\n')
    ttks.update()


# 选择要保存的文件夹
def askd2():
    global paths2
    paths2 = askdirectory() + "/"
    path2.set(paths2)
    print(paths2)


# 选择文件和选择文件夹的输入框
path = tk.StringVar()
path2 = tk.StringVar()
tk.Entry(frame_left, textvariable=path, width=50).pack(padx=5, pady=10)
tk.Entry(frame_left, textvariable=path2, width=50).pack(padx=5, pady=10)

# 按钮
tk.Button(frame_right, text='选择文件', font=fontStyle, width=18, height=1, command=lambda: sFile()).pack(padx=3, pady=3)
tk.Button(frame_right, text='选择保存的文件夹', font=fontStyle, width=18, height=1, command=lambda: askd2()).pack(padx=3,
                                                                                                          pady=3)
tk.Button(frame_left, text='删除数据', font=fontStyle, width=18, height=1, command=lambda: lbsc3()).pack(padx=3, pady=3)
tk.Button(frame_right, text='选中数据', font=fontStyle, width=18, height=1, command=lambda: lbs3()).pack(padx=3, pady=3)


def xl(labels):
    global left1Title
    global top1Title
    left1Title = tk.Label(frame_left, text="左边第一列的数值", font=fontStyle)
    top1Title = tk.Label(frame_right, text="顶部第一行的数值", font=fontStyle)
    left1Title.pack()
    top1Title.pack()
    global left1
    left1 = ttk.Combobox(frame_left, justify='center', state='readonly', width=17, value=labels)
    left1.current(0)
    left1.pack()
    global top1
    top1 = ttk.Combobox(frame_right, justify='center', state='readonly', width=17, value=labels)
    top1.current(0)
    top1.pack()


frame = tk.Frame(window, padx=3, pady=3)
frame.pack()
frame_left2 = tk.Frame(frame)
frame_right2 = tk.Frame(frame)
frame_left2.pack(side='left')
frame_right2.pack(side='right')

tk.Button(frame_left2, text='清空', font=fontStyle, width=15, height=1, command=lambda: qk()).pack(padx=3, pady=3)
tk.Button(frame_right2, text='开始转换', font=fontStyle, width=15, height=1, command=lambda: runTs()).pack(padx=3, pady=3)


# 清空内容的方法
def qk():
    lb.destroy()
    ttks.destroy()
    ttks.pack_forget()
    path.set('')
    path2.set('')
    values2_.clear()

    left1.destroy()
    top1.destroy()
    left1Title.destroy()
    top1Title.destroy()


# 关键方法!!! 透视表生成的方法
def ts(path, paths2):
    print(values2_)
    # ['期初含税金额', '期初未税金额', '期初税金', '销售数量']
    # path 路径名  左边显示名称
    # 首先检测选择的文件是xls还是xlsx,如果说xls就用xlrd读取文件,不用额外填写。
    # 如果是xlsx,就要设置engine='openpyxl',使用openpyxl读取xlsx。 xlrd不能读取xlsx,openpyxl也不能读取xls文件。

    cc = path.endswith(".xls")
    if cc:
        df = pd.read_excel(paths)
    else:
        c2 = paths.endswith(".csv")
        if c2:
            df = pd.read_csv(paths, encoding='GBK')
        else:
            df = pd.read_excel(paths, engine='openpyxl')

    #                   index: 左边的数值  columns: 最上面的数值  values: 要比较的数值 aggfunc:有相同数据时相加 fill_value:空值设置为0  margins:求和
    c1 = df.pivot_table(index=left1.get(), columns=[top1.get()], values=values2_, aggfunc=[np.sum], dropna=False,
                        fill_value=0, margins=True)
    val_ = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    if toCsv == 1:
        p11 = paths2 + val_ + '.csv'
        c1.to_csv(p11, encoding='GBK')
    else:
        p11 = paths2 + val_ + '.xlsx'
        c1.to_excel(p11)

    ts = tkinter.messagebox.showinfo(title='提示', message="转换成功!")
    if ts == 'ok':
        os.startfile(p11)


def runTs():
    rts = thr.Thread(target=ts, daemon=True, args=(paths, paths2))
    rts.start()

window.mainloop()

 如有不懂,可在下方提问。

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

python生成Excel透视表 的相关文章

随机推荐

  • 什么是事件循环 Event Loop

    一 什么是事件循环 事件循环 Event Loop 是单线程的JavaScript在处理异步事件时进行的一种循环过程 具体来讲 对于异步事件它会先加入到事件队列中挂起 等主线程空闲时会去执行事件队列 Event Queue 中的事件 如此反
  • 【不忘初心】Windows11 22000.194 RTM X64 四合一[纯净精简版][2.59G](2021.10.11)

    此版可正常更新补丁 WIN11全新的UI界面出炉 可以说这一次Windows 11全新升级 无论是从Logo上还是UI界面设计 都有很大的变化 母版来自MSDN WIN11 22000 194 为了保证稳定初心的系统全部都是离线精简和优化
  • Matlab:绘制正弦曲线与余弦曲线

    Matlab 绘制正弦曲线与余弦曲线 目录 绘制正弦曲线与余弦曲线 结果显示 实现代码 绘制正弦曲线与余弦曲线 结果显示 实现代码 清空窗口 clear 清空工作区 clc 清空命令行窗口 绘制sin函数 一个区间 x 2 pi 0 1 2
  • Minio大文件上传、文件秒传、断点续传

    初步流程 选择上传文件 gt 提取md5 gt 请求后端校验此md5的文件是否已经上传过 gt 如果有上传就返回信息告诉前端上传完成 秒传 gt 如果没有则根据此md5获取已上传的分片有哪些 未上传的分片有多少个就返回多少个上传url 如何
  • Spring Boot代码结构

    14 组织你的代码 Spring Boot不需要使用任何特殊的代码结构 然而 这里有一些有用的最佳实践 14 1 使用 default 包 当类没有包含package声明时 它被认为处于default package下 通常不推荐使用def
  • 解决 Android 开发过程中 出现 Duplicate class(包冲突)

    1 现在大部分的项目都是支持 Androidx 的 所以出现 Duplicate 的时候 先把 gradle properties 文件中添加参数 支持使用AndroidX android useAndroidX true android
  • 右移和与上&0xff作用

    tmp gt gt 8 0xff 以下是阅读他人文章后 个人对计算 tmp gt gt 8 0xff 的理解 将tmp转为二进制数 6322040 gt 11000000111011101111000 向右移16位 清掉该16位 且左边用0
  • zabbix安装报错:The frontend does not match Zabbix database.

    The frontend does not match Zabbix database 出现此错误为导入数据到数据库zabbix时 对应的mysql版本号与当前不相符 相关代码为 zcat usr share doc zabbix serv
  • 华为OD机试 - 括号匹配(Java)

    题目描述 给定一个字符串 里边可能包含 三种括号 请编写程序检查该字符串中的括号是否成对出现 且嵌套关系正确 若括号成对出现且嵌套关系正确 或该字符串中无括号字符 输出 true 若未正确使用括号字符 输出 false 实现时 无需考虑非法
  • php 7 node.js 并发,PHP7+Swoole、Node Express、Sails、Beego、ThinkPHP 并发性能测试

    最近由于产品业务出现请求瓶颈 需要更换产品框架 针对现在集中主流方案进行了逐一测试 服务器硬件配置 2 核 2G虚拟机 10000请求 500并发测试结果如下 性能测试结果 1 Nodejs Express测试结果如下 大约每秒处理2100
  • Z变换零极点与收敛域的关系

    原文地址 Z变换零极点与收敛域的关系 作者 沙拉酱 Z变换零极点与收敛域的关系 序列的ZT存在零点和极点 这是因为序列的ZT同信号的LT一样都是复变函数 区别只是自变量名称不同 因此其零点和极点的定义与LT的零点与极点的定义相同 在z平面上
  • 厦大纪荣嵘团队新作|OneTeacher: 解锁 YOLOv5 的正确打开方式

    Paper https arxiv org pdf 2302 11299 pdf Code https github com luogen1996 OneTeacher 导读 大家从中也可以看到一个趋势 便是现在监督学习领域已经是非常饱和了
  • UC缓存的php格式视频,UC缓存视频变成本地mp4_下载视频怎么转换mp4_我的下载站

    7条解答 1 uc缓存视频怎么转mp4 您好 很高兴为您服务 安卓版的UC浏览器 缓存的为vdat 保存在UCDownloads videodata这个文件夹里边 可以直接重命名让后将格式更改为mp4或者avi即可 如果仍有问题 请您继续向
  • 一文了解工业互联网标识解析二级节点

    我国工业互联网标识解析体系由国际根节点 国家顶级节点 二级节点 企业节点 公共递归解析节点等要素组成 其中 二级节点是指一个行业或者区域内部的标识解析公共服务节点 能够面向行业或区域提供标识编码注册和标识解析服务 以及完成相关的标识业务管理
  • 学习一门编程语言正确姿势-以python为例

    作为一个自学者 最重要的能力就是自学的学习能力 但不用过分担心浩瀚的计算机世界 因为计算机的底层知识变化是很慢的 比如我们用到的网络知识 几十年都没变化过 就算是最热门的人工智能 现在大家学习的大部分技术也都是十几年 甚至几十年前的技术 变
  • Cordova的配置文件Config.xml

    一 概述 在写这篇文章时 cordova的版本已是9 0 0 config xml 是Cordova项目的全局配置文件 这份配置文件的基础是W3C s Packaged Web Apps Widgets 规范 并进行了扩展 它份配置文件是用
  • 弯道超车!阿里甩出Spring Security宝典我粉了

    第一份笔记 案例介绍 初识权限管理 权限管理概念 完成权限管理需要三个对象 初识Spring Security Spring Security过滤器链 SpringSecurity使用自定义认证页面
  • Java 内存溢出(一)原因、复现、排查

    目录 一 内存溢出原因 二 内存溢出实例 1 堆溢出 2 虚拟机栈和本地方法栈溢出 3 方法区和运行时常量池溢出 4 本机直接内存溢出 三 内存溢出排查 内存溢出 是指应用系统中存在无法回收的内存或使用的内存过多 最终使得程序运行要用到的内
  • Windows控制台API官方文档

    2023年8月21日 周下午 中文文档 控制台函数 Windows Console Microsoft Learn 英文文档 Console Functions Windows Console Microsoft Learn
  • python生成Excel透视表

    假设你有如下数据 姓名 科目 成绩 小黑 语文 42 小娜 语文 23 小白 语文 98 小乐 语文 52 小黑 数学 30 小娜 数学 76 小白 数学 47 小乐 数学 73 小黑 英语 63 小娜 英语 83 小白 英语 4 小乐 英