分享2个Python处理Excel的脚本

article/2025/10/8 14:22:02

一、写在前面

来源于两个读者的学习/工作需求,很巧,这两个读者提的需求都是关于批量合并sheet(检索需要的信息)。

本文所用数据样式,经读者同意,可以公开,文件中的数据为Excel中的Rand函数生成,确保大家在学习、使用代码过程中不会遇到障碍,数据和代码获取方式见文末。

二、基本知识概要

  • pandas创建一个DataFrame对象

pd.DataFrame()

  • pandas datafrmae索引

按列名索引:dataframe[列名]
按列值索引:dataframe[dataframe[列名]==列值]

  • pandas 读取、存储excel文件,存储csv文件

read_excel、to_excel、to_csv

  • pandas datafrmae根据缩影取指定行数据

dataframe.loc[list]

  • pandas datafrmae修改列名

dataframe.rename(columns={‘column_name_old’:‘column_name_new’})

  • pandas datafrmae将数据插入到指定列

dataframe.insert(loc=列序号,column=列名,value=列值)

  • pandas datafrmae根据列名删除指定列

dataframe.drop([列名],axis=1)

  • pandas 连接多个datafrmae

pd.concat([df_1, df_2])

三、开始动手动脑

3.1 第一个读者需求

首先我们先看第一个读者的需求:原始数据有18个Excel文件,每个Excel文件里有34个sheet(34个省的相关数据),需要取出每个sheet中指定的几行数据,然后全部合并起来,存储到一个新的文件,命名为2000_2017年各省份碳排放数据。

经过沟通,我确定了最终输出文件的样式,以下数据都是用Excel中的随机函数生成:

完成这个需求,如果是手动操作我们需要完成以下几个步骤:

0、新建一个Excel

1、打开第一个Excel
2、复制出每个sheet中需要的几行数据
3、将复制出来的数据粘贴到新建的Excel中
4、重复1-3,直到取出所有Excel中的数据
5、保存新建的Excel

如果只是1-2个文件,动手还可以接受,但是要是有几十个,几百个,如果靠动手就头大了。
现在我们看看以上手动操作换成代码操作需要那些步骤:

0、新建一个数据存储对象(我们用pandas中的Dataframe)

1、读取目标Excel文件
2、遍历取出每个sheet中需要的几行数据,存储到新建的Dataframe中
3、for循环遍历,读取所有目标Excel数据,并存储到新建的Dataframe中
4、将新建的Dataframe数据保存为一个Excel文件

了解了这些后,我们就开始愉快的代码之旅吧:

0、新建一个数据存储对象(我们用pandas中的Dataframe)

df_concat = pd.DataFrame()
复制代码

1、读取目标Excel文件
文件一共有18个文件,文件名也是有规则的。

file_path = 'data/2000年-2017年碳排放清单/2000年30个省份排放清单.xlsx'
data = pd.read_excel(file_path, sheet_name=None)
复制代码

2、遍历取出每个sheet中需要的几行数据,存储到新建的Dataframe中
为了代码的可读性,这里写了一个函数get_sheet_data来取出单个sheet中需要的数据,然后for循环遍历所有的sheet。

'''
取出单个sheet中需要的数据
'''
def get_sheet_data(data, sheet_name, year):# 取需要的几行数据df_concat = data[sheet_name].loc[[2,3,48,49]]# 给 Unnamed: 0 列进行重命名df_concat = df_concat.rename(columns={'Unnamed: 0':'类别'})# 插入两列数据 省份	年份df_concat.insert(loc=0,column='省份',value=sheet_name)df_concat.insert(loc=1,column='年份',value=i)# 将Total这列移动到第四列df_temp = df_concat['Total']df_concat = df_concat.drop(['Total'],axis=1)  # 先删除该列df_concat.insert(loc=3,column='Total',value=df_temp)  # 然后插入到第四列位置return df_concatfor sheet_name in list(data.keys()):if sheet_name == 'Sum':continuedf_temp = get_sheet_data(data, sheet_name, year)df_concat = pd.concat([df_concat, df_temp])
复制代码

3、for循环遍历,读取所有目标Excel数据,并存储到新建的Dataframe中
在上一步,已经读取出了单个Excel中的所有sheet,现在再利用for循环遍历读取所有Excel中的数据。

'''
取出单个Excel中需要的数据
'''
def get_excel_data(data, year):df_concat = pd.DataFrame()for sheet_name in list(data.keys()):if sheet_name == 'Sum':continuedf_temp = get_sheet_data(data, sheet_name, year)df_concat = pd.concat([df_concat, df_temp])return df_concat# 生成一个列表,存储时间
date_year = [str(i) for i in range(2000, 2018)]
for i in date_year:file_path = 'data/2000年-2017年碳排放清单/%s年30个省份排放清单.xlsx'%idata = pd.read_excel(file_path, sheet_name=None)df_temp = get_excel_data(data, i)df_concat = pd.concat([df_concat, df_temp])
复制代码

4、将新建的Dataframe数据保存为一个Excel文件
这里直接调用pandas内置的to_excel函数,第一个参数为文件存储目录,第二个参数为sheet_name,第三个参数是编码格式,这里指定为utf-8。

print("开始存储数据")
df_concat.to_excel("data/2000_2017年省份碳排放数据.xlsx", "2000_2017", index=None, encoding="utf-8")
print("数据保存成功")
复制代码

完整代码如下:

import pandas as pd
import time'''
取出单个sheet中需要的数据
'''
def get_sheet_data(data, sheet_name, year):# 取需要的几行数据df_concat = data[sheet_name].loc[[2,3,48,49]]# 给 Unnamed: 0 列进行重命名df_concat = df_concat.rename(columns={'Unnamed: 0':'类别'})# 插入两列数据 省份	年份df_concat.insert(loc=0,column='省份',value=sheet_name)df_concat.insert(loc=1,column='年份',value=i)# 将Total这列移动到第四列df_temp = df_concat['Total']df_concat = df_concat.drop(['Total'],axis=1)  # 先删除该列df_concat.insert(loc=3,column='Total',value=df_temp)  # 然后插入到第四列位置return df_concat'''
取出单个Excel中需要的数据
'''
def get_excel_data(data, year):df_concat = pd.DataFrame()for sheet_name in list(data.keys()):if sheet_name == 'Sum':continuedf_temp = get_sheet_data(data, sheet_name, year)df_concat = pd.concat([df_concat, df_temp])return df_concat# 0、新建一个数据存储对象(我们用pandas中的Dataframe)
df_concat = pd.DataFrame()# 生成一个列表,存储时间
date_year = [str(i) for i in range(2000, 2018)]# 1、遍历取出每个Excel中的每个sheet中需要的几行数据,存储到新建的Dataframe中
for i in date_year:file_path = 'data/2000年-2017年碳排放清单/%s年30个省份排放清单.xlsx'%idata = pd.read_excel(file_path, sheet_name=None)df_temp = get_excel_data(data, i)df_concat = pd.concat([df_concat, df_temp])# 2、写入数据
print("开始存储数据")
df_concat.to_excel("data/2000_2017年省份碳排放数据.xlsx", "2000_2017", index=None, encoding="utf-8")
print("数据保存成功")
复制代码

3.2 第二个读者需求

我们来看第二个读者的需求:原数据只有一个文件,里面有8个sheet,需要将每个sheet中的几列取出来,然后根据日期存储为一个一个的csv文件。

完成这个需求,如果是手动操作我们需要完成以下几个步骤:

0、打开Excel文件

1、复制出每个sheet中需要的几行数据
2、根据日期进行排序
3、按日期将不同的数据存入不同csv文件

看似很简单,但实际却是复杂的,比如要手动创建保存365个csv文件,文件名字还不一样,想着就头大!

现在我们看看以上手动操作换成代码操作需要那些步骤:

0、新建一个数据存储对象(我们用pandas中的Dataframe)

1、读取目标Excel文件
2、遍历取出每个sheet中需要的几行数据,存储到新建的Dataframe中
3、根据日期进行分组,将不同日期数据存储到对应的文件

了解了这些后,我们就开始愉快的代码之旅吧: 0、新建一个数据存储对象(我们用pandas中的Dataframe)

df_concat = pd.DataFrame()
复制代码

1、读取目标Excel文件

file_path = 'data/meteo_china_tmin_2018.xlsx'
data = pd.read_excel(file_path, sheet_name=None)
复制代码

2、遍历取出每个sheet中需要的几行数据,存储到新建的Dataframe中

for sheet_name in list(data.keys()):if sheet_name == 'meteo_china_tmin_2018':continuedf_temp = data[sheet_name][['ymd', 'lat', 'lon', 'tmin']]df_concat = pd.concat([df_concat, df_temp])
复制代码

3、根据日期进行分组,将不同日期数据存储到对应的文件
这里根据日期进行检索对应的数据,并调用to_csv函数存储数据,第一个参数为存储的目录,第二个参数columns为存储的数据列,第三个参数header=None表示存储的时候不需要表头,第四个参数index=False表示去除索引。

'''
按时间进行分组,并保存为csv文件
文件格式:hetao-ymd_tmin
'''
# 获取所有日期
ymd_set = set(df_concat['ymd'])
# 循环操作所有数据
for ymd in ymd_set:ymd_data = df_concat[df_concat['ymd']==ymd]ymd_data.to_csv('./data/hetao/hetao-%d_tmin.csv'%ymd, columns=['lat', 'lon', 'tmin'], header=None, index=False)
复制代码

完整代码:

import pandas as pd'''
读取、取出需要的数据并合并
'''
file_path = './data/meteo_china_tmin_2018.xlsx'
data = pd.read_excel(file_path, sheet_name=None)
df_concat = pd.DataFrame()for sheet_name in list(data.keys()):if sheet_name == 'meteo_china_tmin_2018':continuedf_temp = data[sheet_name][['ymd', 'lat', 'lon', 'tmin']]df_concat = pd.concat([df_concat, df_temp])'''
按时间进行分组,并保存为csv文件
文件格式:hetao-ymd_tmin
'''
# 获取所有日期
ymd_set = set(df_concat['ymd'])
# 循环操作所有数据
for ymd in ymd_set:ymd_data = df_concat[df_concat['ymd']==ymd]# 指定存储的列,并且去掉表头ymd_data.to_csv('./data/hetao/hetao-%d_tmin.csv'%ymd, columns=['lat', 'lon', 'tmin'], header=None, index=False)
复制代码

四、随便说说

大家如果有什么类似需求,可以说下你的需求,按功能点分1 2 3 最好,然后附上示例数据,欢迎大家进行学习交流。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/T5BCOiKb.shtml

相关文章

热烈祝贺我公司获得“渣土车智慧监控平台软件著作权登记证书”

根据《中华人民共和国计算机软件保护条例》和《计算机软件著作权登记办法》的规定,经中华人民共和国国家版权局审定,我公司自主研发的——“索迪迈渣土运输管理平台V1.0”的软件,被正式授予《中华人民共和国国家版权局计算机软件著作权登记证…

热烈祝贺公司获得“采砂智能监控管理平台”计算机软著权登记证书

热烈祝贺我司荣获计算机软件著作权登记证书。我司一直十分注重产品研发工作,我们坚信技术创新是公司生存的基础,科技发展是企业腾飞的平台。 这次计算机软件著作权登记证书的获得有利于公司进一步完善知识产权保护体系,形成持续创新机制&…

10万+标注数据开放!驾驶员不良驾驶识别/电动车进电梯检测/渣土车车牌识别/反光衣识别等8大赛题详解来了!...

ECV-2021极市计算机视觉开发者榜单大赛(以下简称ECV-2021)已于2021年7月6日正式开赛! ECV-2021由青岛市人民政府指导,极视角科技有限公司、 青岛市委台港澳办、青岛市工业和信息化局、青岛西海岸新区管委和青岛市城市管理局主办&a…

停车场智能化管理系统

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于停车场智能化管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了停车场智能化管理系统,它彻底…

XX市智慧环卫管理系统解决方案V1.0

目 录 第一章 建设背景 1 1.1 管理背景 1 1.2 需求分析 1 第二章 方案概述 4 2.1 方案简介 4 2.2 系统架构 5 第三章 系统功能设计 6 3.1 车辆机务管理子系统 6 3.1.1 车辆台账管理 6 3.1.2 车辆维修管理 7 3.1.3 车辆维保管理 7 3.2 环卫车辆监管子系统 8 3.2.1 …

工程机械车辆环保数据监控平台

软件架构文档 版本 <1.1> 目的 本文档将从架构方面对系统进行综合概述&#xff0c;其中会使用多种不同的架构视图来描述系统的各个方面。它用于记录并表述已对系统的架构方面作出的重要决策。 架构目标和约束 系统在开发过程中有如下设计约束&#xff1a;开发语言为J…

机动车乱停乱放检测系统(源码&部署教程)

1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的机动车乱停乱放检测系统(源码&#xff06;部署教程)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器 并在 V100 上&#xff0c;30 FPS 的情况下…

24小时不间断监控垃圾车运行轨迹,Web 3D 智慧环卫

智慧环卫系统作为智慧城市的一部分&#xff0c;是社会发展的需要。城市环卫有诸多痛点&#xff0c;也需要通过更加先进的技术来解决。 HT for Web 不止自主研发了强大的基于 HTML5 的 2D、3D 渲染引擎&#xff0c;为可视化提供了丰富的展示效果。介于 2D 组态和 3D 组态上&…

工地车辆未冲洗识别 渣土车清洗检测系统 YOLO

工地车辆未冲洗识别 渣土车清洗检测系统通过AI图像识别技术性边缘视频分析以及yolo深度学习模型等技术&#xff0c;对现场画面中车辆清洗进行识别检测。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测&#xff0c;核心思想就是利用整张图作为网络的输入&#xff0c;直…

渣土车识别YOLOv5

主要使用的技术 开发软件 pycharm anaconda 开发语言 Python 开发框架 pytorch 主要开源库:OpenCV numpy 等 主要技术:yolov5 gpu加速:cuda cudnn&#xff0c;兼容CPU模式

智慧环卫管理系统方案

智慧环卫管理系统方案 2022年6月 慧环卫项目综述 智慧环卫背景 城市环境卫生管理是一项复杂而系统的社会工程&#xff0c;不仅是一个城市的“脸面”也是一个城市的文明程度的重要标志。是与人民群众生活最直接、最贴切、最敏感的重要工作之一&#xff0c;随着城市人民生活水平…

渣土车未苫盖识别系统 yolov8

渣土车未苫盖识别系统通过yolov8python&#xff0c;渣土车未苫盖识别系统对经过的渣土车进行实时监测&#xff0c;当检测到有渣土车未能及时苫盖时&#xff0c;将自动发出警报提示现场管理人员及时采取措施。Yolo模型采用预定义预测区域的方法来完成目标检测&#xff0c;具体而…

工地渣土车清洗识别检测 YOLOv5

工地渣土车清洗识别检测集成边缘Ai视频分析技术、机器视觉、yolov4网络模型架构等技术&#xff0c;对将要驶离工地的渣土车进行清洗识别检测。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利box将分类与目标定位的回归问题结合起来&#xff0c;从而做到了高效…

车辆管理系统源代码

以上为作业总要求&#xff0c;然后就是源代码了&#xff0c;代码不算难&#xff0c;但是过程比较费时间&#xff0c;所以分享出来&#xff0c;可能还有不少错误&#xff0c;只是给大家作为借鉴。 界面部分 界面做得比较差&#xff0c;大家可以根据自己的审美去做即可。 代码部分…

渣土车密闭运输识别算法 yolov7

渣土车密闭运输识别系统通过pythonyolov7网络模型技术&#xff0c;渣土车密闭运输识别算法对渣土车的密闭运输情况进行实时监测&#xff0c;检测到有未密闭的渣土车进入工地区域或者行驶在道路上时&#xff0c;渣土车密闭运输识别算法将自动发出警报提示现场管理人员及时采取措…

渣土车空车未盖盖识别系统 OpenCv

渣土车空车未盖盖识别系统通过OpenCvyolo网络模型实时检测路过的渣土车情况&#xff0c;发现空车未盖盖立即进行抓拍回传。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API&#xff0c;结合了OpenCV CAPI和Python语言…

车辆管理系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言二、系统需求分析及相关技术介绍2.1 功能需求分析2.2 可行性分析2.3 系统运行环境2.4 相关技术介绍 三、系统总体设计3.1 系统功能结构设计3.2 系统功能流程…

渣土车智能识别检测 yolov5

渣土车智能识别检测通过yolov5网络模型深度学习技术&#xff0c;渣土车智能识别检测对禁止渣土车通行现场画面中含有渣土车时进行自动识别监测&#xff0c;并自动抓拍告警。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0…

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 通过Python基于YOLOv7深度学习网络对现场画面实时监测分析。当识别到现场车辆冲洗不干净或者没有冲洗&#xff0c;系统就立即抓拍。与C / C等语言相比&#xff0c;Python速度较慢。也就是说&#xff0c;Python可以使用C / C轻松…

智慧环卫车辆监控管理系统方案

智慧环卫车辆监控管理系统方案 1 系统架构设计方案 1.1 系统构成 该系统主要分为三部分&#xff1a;车载终端部分、通信网络部分和监控调度指挥中心部分。 如下图&#xff1a; 1.2 车载终端部分构成图 车载终端部分主要由2G/3G视频监控设备主…