datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理

“ 以后数据处理,都用pandas”

01 面临问题

作为运维人员,每周要统计很多数据,特别是周四写周报的时候,基本要花半天时间。既然已经学了Python,那就试试优化它。以统计不同厂家、不同设备类型告警量为例。

81fc5477315b513ee1ad2f9418a3799d.png

需要将多份类似表格中的 “厂家-设备类型” Sheet数据合并、处理、汇总,该sheet的数据格式如下:

7de020d60d54e43ee46797572326383e.png

期望按照厂家、设备类型汇总告警量,并进行分析。由于部分厂家、设备类型可能缺失导致无法对齐,无法自动相加。又是常态化重复工作,需要自动化解决方案。

02怎么办

Python提供很多强大的数据分析相关的库,如numpy、pandas等。下面就看看pandas如何帮助我们实现转型吧。

pandas读取excel

import pandas as pd
#定义待读取的文件名
filename1 = '全量告警_38AB1AE7.xlsx'
filename2 = '全量告警_964C9DCF.xlsx'
#使用pandas的函数读取excel,当前目录,直接写文件名即可,可以有很多参数,这里指定所需sheet
df1 = pd.read_excel(filename1,sheetname='厂家-设备类型')
df2 = pd.read_excel(filename2,sheetname='厂家-设备类型')

以上代码可以读取两个excel文件。通过pandas.head() 可以显示前几行数据,快速查看DataFrame的格式,如列名,数据类型等,判断是否正确载入数据。

d9ece2b85c1911d4cc466d1fad86b5ba.png

pandas按照特定列合并处理

两个df如何按照厂家和设备类型对告警量进行累加呢?就是按照“厂家”和“设备类型”两列进行处理。最容易理解的办法就是循环,通过遍历所有厂家和设备类型组合,然后将每个df对应的值求和。

首先要知道两个文件的最大厂家、设备类型集合,然后再遍历。

#获取两个文件的最大厂家、设备类型集合
cjlx1 = [tuple(df1.loc[i][['厂家','设备类型']]) for i in df1.index]
cjlx2 = [tuple(df2.loc[i][['厂家','设备类型']]) for i in df2.index]
cjlx = set(cjlx1+cjlx2)
#遍历最大设备类型集合,求得合并告警量
rows = [] #输出列表集合,可以转换为DataFrame
for i in cjlx:  #遍历最大(厂家、类型)集合cj = i[0]   #获取厂家名称lx = i[1]   #获取设备类型if i in cjlx1:  #如果该(厂家,类型)对在文件1中,取得对应告警量,否则告警量为0num1 = df1[(df1['厂家'] == cj) & (df1['设备类型']==lx)]['告警量'].iloc[0]else:num1 = 0if i in cjlx2:num2 = df2[(df2['厂家'] == cj) & (df2['设备类型']==lx)]['告警量'].iloc[0]else:num2 = 0   num = num1 + num2    #两个告警量相加row = [cj,lx,num]   #生成新的一行数据rows.append(row)    #追加到输出列表
data = pd.DataFrame(rows,columns = ['厂家','设备类型','告警量'])     #转换为DataFrame

输出data已经是汇总后的数据,可以用代码检查下。

In[112]: len(df1),len(df2),len(data)  #In表示输入,冒号后才是真实代码
Out[112]: (71, 78, 80)
In[113]:data.head()
Out[113]: 厂家     设备类型   告警量
0  CISCO      交换机  2021
1     东信     HOST    56
2     东信      交换机    16
3     中兴     HOST   182
4    爱立信  HSS_SLF     2

可以发现原始两个文件一个有71行数据,一个78行数据,合并后数据80行。

Pandas优化处理

Pandas是一个非常优秀的数据处理库,实现上述功能肯定不用这么复杂。自带的函数可以快速合并、规整两个DataFrame。主要有append、merge和concat等操作。

append

可以在df后添加行或者另一个df。对合并后的df3进行分组groupby处理,按照告警量列进行求和(分组键会作为index,需要提取出来作为新的一列):

In[125]:df3 = df1.append(df2)
In[125]:len(df1),len(df2),len(df3)  #df3的行数是df1 和df2的和
Out[125]: (71, 78, 149)

merge

通过一个或多个键(列名)将行连接起来。支持多种连接方式,左连接,右连接等,类似数据库join操作。其中on表示用哪些键连接起来,how表示连接方式。

In[135]:df4 = pd.merge(df1,df2,on=['厂家','设备类型'],how = 'outer')
In[136]:df1.shape,df2.shape,df4.shape,  #可以发现df4是80*4,其中80行已经是最大集合,是我们想要的结果,
Out[136]: ((71, 3), (78, 3), (80, 4))
In[137]:df4.head()
Out[137]: 厂家  设备类型   告警量_x  告警量_y
0    CISCO  HOST    16.0    1.0
1    CISCO   交换机  1484.0  537.0
2    CISCO   路由器    93.0  152.0
3      IBM  HOST   702.0  745.0
4  JUNIPER   路由器     7.0    6.0

其中告警量_x,告警量_y是原先两个告警量,相同列名会自动增加_x和_y,以便区分。接下来只需将这两列相加即可。

df4['告警量'] = df4['告警量_x'] + df4['告警量_y']

这样直接相加会有问题,存在nan值问题(某些厂家设备类型数据缺失)

f99132566f44e88dbeb7bee5867b0121.png

需要在相加之前进行处理。将nan值替换为0,再求和。

优化后代码如下:

#使用pd.merge()  快速连接
data = pd.merge(df1,df2,on=['厂家','设备类型'],how = 'outer') #连接两个df
data = data.fillna(0)   #用0替换nan值
data['告警量'] = data['告警量_x'] + data['告警量_y'] #两个告警量相加,得到新的一列告警量
data = data[['厂家','设备类型','告警量']]    #只选取我们想要的三列

以上结果和循环遍历结果一致。

Pandas文件保存

Pandas可以非常方便将文件保存为各种格式,如df.to_csv()、df.to_excel()。建议直接使用to_csv,简单快速。

data.to_csv('out.csv',encoding= 'gbk',index = False)
lsC:Userszhuf0Documentsrepositorypythondemo 的目录2018/04/04  08:44    <DIR>          .
2018/04/04  08:44    <DIR>          ..
2018/04/04  08:44               521 out.csv

可以发现当前目录已经有out.csv。其中encoding设置了编码方式、index可以设置是否保存索引。

代码优化

上面已经实现了核心功能,下面将代码优化一下,以便复用。

优化1 基本功能函数化

编写一个函数,输入两个df,返回求和后df。

def get_df_sums(df1,df2):if df1.empty:   #检查其中一个df为空return df2elif df2.empty:return df1else:data = pd.merge(df1,df2,on=['厂家','设备类型'],how = 'outer') #连接两个dfdata = data.fillna(0)   #用0替换nan值data['告警量'] = data['告警量_x'] + data['告警量_y'] #两个告警量相加,得到新的一列告警量data = data[['厂家','设备类型','告警量']]    #只选取我们想要的三列return data

优化2 自动读取多个文件

一般情况下,待汇总的文件不止两个,我们可以使用Python脚本自动读取某个特定路径下所有文件。

import os
path = r"C:UserstestDocumentsrepositorypythondemo"
out = pd.DataFrame()
for filename in os.listdir(path):#遍历指定路径的所有文件名if '全量告警' in filename: #选择指定文件待读取filename = path+""+filename   #获取绝对路径df1 = pd.read_excel(filename,sheetname='厂家-设备类型')   #读取该sheetout = get_df_sums(out,df1)  #和之前的out累积求和,类似 sum=sum+i

只需要将待汇总的文件放到指定目录即可,输出out.csv。

优化3 排序后保存

Pandas 有很强大的排序功能。sort_values如按照告警量排序:

In[164]out = out.sort_values(by = '告警量',ascending = False)  #按照告警量降序排列
In[164]:out.head()
Out[164]: 厂家        设备类型       告警量
7   爱立信         BSC  481307.0
65   中兴         MME  163725.0
14  爱立信         MME   99553.0
13  爱立信         MGW   37488.0
16  爱立信  MSC_Server   24683.0

留个问题

思考能否分组排序,按厂家分组,如爱立信,然后组内告警量降序排列。厂家的排序方式按照该厂家的最大告警量排序,而不是厂家的名称。如爱立信后是中兴。

最终代码

最终优化后脚本为,保存为pandas_demo.py文件:

import pandas as pd
import os
#给定两个df,返回求和后结果
def get_df_sums(df1,df2):if df1.empty:   #检查其中一个df为空return df2elif df2.empty:return df1else:data = pd.merge(df1,df2,on=['厂家','设备类型'],how = 'outer') #连接两个dfdata = data.fillna(0)   #用0替换nan值data['告警量'] = data['告警量_x'] + data['告警量_y'] #两个告警量相加,得到新的一列告警量data = data[['厂家','设备类型','告警量']]    #只选取我们想要的三列return data
#给定路径path,求和指定格式全部文件
def get_all_path(path):out = pd.DataFrame()for filename in os.listdir(path):#遍历指定路径的所有文件名if '全量告警' in filename: #选择指定文件待读取filename = path+""+filename   #获取绝对路径df1 = pd.read_excel(filename,sheetname='厂家-设备类型')   #读取该sheetout = get_df_sums(out,df1)  #和之前的out累积求和,类似 sum=sum+iout = out.sort_values(by = '告警量',ascending = False)return out#作为主程序运行
if __name__ =='__main__':path = r"C:UserstestDocumentsrepositorypythondemo"out = get_all_path(path)out.to_csv('out.csv',encoding= 'gbk',index = False) #保存

脚本使用

只要我们将待处理的文件放到该目录,然后命令行运行该脚本即可。

执行 python pandas_demo.py 没有任何提示,说明成功。

21c774f197e7f8a67653e9ecf01d3ee4.png

至此,在公司IT转型过程中,我用Python完成了第一个小项目,提升自我工作效率,省下的时间可以继续学习了。

03 为什么

为什么要这么做?

职场学习就是要提升生产力,将日常重复性低价值工作交给机器。

Pandas是一个强大的数据分析第三方库,Anaconda已经自动携带,无需安装,只需import导入即可使用。一般用以下语法:

import pandas as pd

Pandas提供两种常用的数据结构:Series和DataFrame。
其中Series可以看作一行或一列数据,DataFrame是一个二维表格数据,和excel表格类似,有行索引和列索引。
Pandas提供很多便捷的函数,用来创建、处理、保存DataFrame。

从office的Excel表格切换到Pandas非常容易理解。

在自动化、智能化演进过程中,公司要转型,个人也要。

从身边小事做起,代码让工作更美好。

04 其他选择

有没有更好的选择?

除了merge,concat可以实现类似的连接,然后再进行处理。如有兴趣可以思考。

脚本可以继续优化

进一步优化将路径作为参数提供,指定输出目录,增加一些提示性输出,增加脚本稳健性。pandas海量数据处理优化

大数据处理是一个经典问题,如何优化效率已经是编码之道

暂时能力有限,不能涉及。很多牛人已经完成优化,还有很多类似的第三方库,如datatable等。

作为初学者,选择一个合适的,先入门。如果主要工作内容是大数据处理与分析,那么后面慢慢深入研究而得道。期待你的分享。

欢迎大家留言讨论。

下篇我会继续分享第二个小项目实践,欢迎关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas尾部添加一条_Numpy与Pandas

Numpy#导入numpy包 import numpy as np ##from numpy import * #定义数组 #一维数组 anp.array([1,2,3,4]) #二维数组 bnp.array([(1,2,3),(4,5,6)]) #定义数组类型 cnp.array([(1,2),(3,4)],dtypecomplex) #array([[ 1.0.j, 2.0.j],[ 3.0.j, 4.0.j]])#数组的维数 a.shape #(…

python爬虫获取url_Python爬虫如何获取页面内所有URL链接?本文详解

如何获取一个页面内所有URL链接&#xff1f;在Python中可以使用urllib对网页进行爬取&#xff0c;然后利用Beautiful Soup对爬取的页面进行解析&#xff0c;提取出所有的URL。什么是Beautiful Soup&#xff1f; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索…

iview table增加一行减少一行_PQ入门函数:Table.ReplaceValue

一、基础介绍Table.ReplaceValue函数的官方说明如下&#xff1a;Table.ReplaceValue(table as table, oldValue as any, newValue as any, replacer as function, columnsToSearch as list)该函数实现的功能是将Table中的值替换成新值&#xff0c;语法翻译成汉语大致如下&#…

gprs模块ftp 远程升级_基于GPRS无线通信技术的冷链监测系统

GPRS&#xff08;general packet radio service&#xff09;是通用分组无线业务的简称&#xff0c;该技术建立在GSM网络的基础上&#xff0c;被称为2.5 代移动通信技术&#xff0c;它将无线通信与Internet 紧密结合。基于GPRS的远程数据采集系统是通过中国移动的GPRS无线通信网…

小米登录协议分析_联想前副总裁常程跳槽小米数月后,波澜再起

► 文 观察者网 吕栋今年初&#xff0c;联想集团前副总裁常程离职2天即加盟小米&#xff0c;这一举动是否违反竞业协议&#xff0c;双方当时曾各执一词。最近&#xff0c;由于联想方面在北京提起劳动仲裁&#xff0c;此事也再度引发舆论关注。9月21日&#xff0c;针对“联想与…

值从哪里来_Linux used内存到底去哪里了呢?

Linux used内存到底去哪里了呢&#xff1f;阅读文章之前请先思考这么个问题我ps aux看到的RSS内存只有不到30M&#xff0c;但是free看到内存却已经使用了7,8G了&#xff0c;已经开始swap了&#xff0c;请问ps aux的实际物理内存统计是不是漏了哪些内存没算&#xff1f;我有什么…

html文本最小长度,CSS中处理不同长度文本的几种小技巧

CSS中处理不同长度文本的几种小技巧【推荐教程&#xff1a;CSS视频教程 】当我们使用 CSS 构建布局时&#xff0c;考虑长短文本内容很重要&#xff0c;如果能清楚地知道当文本长度变化时需要怎么处理&#xff0c;可以避免很多不必要的问题。在许多情况下&#xff0c;添加或删除…

matlab 判断鼠标按下_Simulink(其他校验模块)+Matlabgui(鼠标响应事件)+Stateflow汽车运动逻辑状态(二)...

1 SimulinkSimulink-其他校验模块 如下图所示为一些其他的校验模块&#xff0c;分别为声明模块&#xff0c;离散梯度模块&#xff0c;输入分辨率检测模块&#xff1b;声明模块&#xff1a;当输入值非零时检测通过&#xff0c;当输入值中包含有0时&#xff0c;检测模块报错。…

鸿蒙电脑操作系统最新消息,5G专家预测:7年后鸿蒙将成全球第一大操作系统

在公布两年之后&#xff0c;华为的鸿蒙系统历尽千难万险&#xff0c;蓄势待发&#xff0c;即将在6月2日的线上发布会上正式发布。对于鸿蒙的前景&#xff0c;通信行业的 5G 专家项立刚在接受采访中&#xff0c;在谈到对鸿蒙的看法时&#xff0c;他表示他相信 7 年后鸿蒙会成为全…

vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...

前言又到周五了。今日早读文章由Shopee周雨楠翻译授权分享。周雨楠&#xff0c;Shopee金融事业群前端研发&#xff0c;自主学习前端技术3年&#xff0c;喜爱各类数字媒体技术、创意设计&#xff0c;多次参与翻译工作。福利&#xff1a;有两张门票&#xff0c;有需要的跟情封联系…

centos7 转换为lvm_(建议收藏)CentOS7挂载未分配的磁盘空间以及LVM详细介绍

简述本文主要介绍CentOS7下如何挂载未分配磁盘空间的详细操作步骤。LVMLVM&#xff0c;逻辑卷管理&#xff0c;英文全称Logical Volume Manager&#xff0c;是Linux环境下对磁盘分区进行管理的一种机制。是在硬盘分区和文件系统之间添加的一个逻辑层&#xff0c;为文件系统屏蔽…

基于python的图书管理系统测试步骤_Django admin实现图书管理系统菜鸟级教程完整实例...

Django 有着强大而又及其易用的admin后台,在这里,你可以轻松实现复杂代码实现的功能,如搜索,筛选,分页,题目可编辑,多选框. 简单到,一行代码就可以实现一个功能,而且模块之间耦合得相当完美. 不信,一起来看看吧!?用Django实现管理书籍的系统,并能在前台界面对书籍进行增删查改…

c# image转换为bitmap_Python PIL.Image与numpy.array之间的相互转换

前言有时我们使用PIL库读入图像数据后需要查看图像数据的维度&#xff0c;比如shape&#xff0c;或者有时我们需要对图像数据进行numpy类型的处理&#xff0c;所以涉及到相互转化&#xff0c;这里简单记录一下。方法当使用PIL.Image.open()打开图片后&#xff0c;如果要使用img…

计算机网络互联设备功能,计算机网络互联设备简介

一、网卡v 网络适配器&#xff0c;俗称网卡(NIC&#xff0c;Network InterfaceCard 或 Ethernet network card ) 原理&#xff1a;• 工作在OSI/RM中数据链路层的设备– 是局域网接入设备&#xff0c;单机与网络间架设的桥梁 特征&#xff1a;• MACaddress&#xff1a;– uniq…

安全使用计算机事例,计算机安全案例分析.ppt

您所在位置&#xff1a;网站首页 > 海量文档&nbsp>&nbsp资格/认证考试&nbsp>&nbsp安全工程师考试计算机安全案例分析.ppt35页本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性&#…

bootstrap外不引用连接_网络编程Netty IoT百万长连接优化,万字长文精讲

IoT是什么The Internet of things的简称IoT&#xff0c;即是物联网的意思IoT推送系统的设计比如说&#xff0c;像一些智能设备&#xff0c;需要通过APP或者微信中的小程序等&#xff0c;给设备发送一条指令&#xff0c;让这个设备下载或者播放音乐&#xff0c;那么需要做什么才…

计算机基础知识与程序设计二,计算机基础与程序设计.doc

计算机基础与程序设计.doc (17页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;14.9 积分&#xfeff;《计算机基础与稈序设计》是高等教冇H学考试工科备专业的基础课。这门课也是大部分学 生学习计算…

为什么python 为什么没有接口_python没有接口吗

接口只是定义了一些方法&#xff0c;而没有去实现&#xff0c;多用于程序设计时&#xff0c;只是设计需要有什么样的功能&#xff0c;但是并没有实现任何功能&#xff0c;这些功能需要被另一个类&#xff08;B&#xff09;继承后&#xff0c;由 类B去实现其中的某个功能或全部功…

画直线_在鸡面前画一条直线,为什么它会晕?西瓜视频这知识好冷告诉答案

为什么世界有那么多的未解之谜&#xff0c;我们无从而知&#xff0c;今天我们来探讨一下在鸡面前画条直线为什么会晕&#xff1f;你们知道吗&#xff1f;今天西瓜视频这知识好冷告诉你们答案&#xff0c;帮助你们掌握生活中所不知道的涨知识&#xff0c;增加我们的知识库。优秀…

永洪bi_案例分享!永洪BI助力知名三甲医院数字化转型升级

案例一&#xff1a;“新数据需求立刻看到结果”建院至今已有100余年的历史&#xff0c;现已发展成为集医疗、科研、教学为一体的某家三级甲等综合医院&#xff0c;通过永洪科技大数据平台&#xff0c;基于医院的HIS系统为数据源&#xff0c;分别从运营管理、药品管理、病例管理…