徐文昭
(四川建筑职业技术学院,四川 德阳 618000)
近些年来,伴随着网络技术与云计算技术的蓬勃飞速发展,社会各个领域的数据汇聚到网络中来,网络数据时时刻刻呈现爆炸性增长,我们生活在数据的汪洋大海中,大数据时代已然到来。面对纷繁复杂、日益增长的海量数据,能够从中发现并挖掘有规律、有价值的信息——数据分析处理,显得越来越重要。Python因其语法简单精练、拥有巨大且活跃的科学计算社区、强大的通用编程能力、人工智能时代可作为通用语言及可对接其他语言等优势特性,成为数据分析处理的首要编程语言。作为Python一个重要的库,Pandas是一款基于numpy、专门为了解决数据分析任务的工具,其间不仅纳入了大量的库和一些标准的数据模型,而且提供了高效操作大型数据集所需的工具,被广泛应用到许多领域,包括经济、统计和分析等学术及商业领域。
Python的Pandas库里有两个非常重要的数据结构:Series和DataFrame。其中,前者是一维的数据结构,后者是二维的、表格型的数据结构。我们可以把文件里的数据读入程序进行处理,处理过程中涉及索引及切片操作。这两种数据类型的对象都支持索引及切片操作,DataFrame对象的元素可以通过索引和切片来访问和修改,就像Python内置的容器对象一样。
从表面上来看,因为Series类对象属于一维数据结构,它使用索引和切片的方式与NumPy数组索引和切片非常类似,但Series的索引值不只是整数。但对于DataFrame来说,索引和切片的使用方式就与列表大不一样了。DataFrame结构不仅包含行索引,也包含列索引。其中,行索引是通过index属性进行获取的,列索引是通过columns属性进行获取的。DataFrame里每列数据都是一个Series对象,这样,可以使用列索引进行获取。其中有一种特别的索引——布尔型索引。布尔型索引指的是将一个其元素为布尔型数据的Series对象或DataFrame对象作为模板筛选数据,返回与模板中元素值为True位置对应的元素。
在一张Excel表里,存储着若干行数据,分散记录了各组员工工作的完成次数(具体如表1所示),现在要求分组统计筛选出各组完成次数最多的员工数据行。
表1 各组员工工作完成的次数
我们很可能不由自主地想到了Excel里的分类汇总以及数据透视功能。“分类汇总”是对同类别的数据进行统计汇总,是将相同类别的数据放在一起,然后进行求和、最大(小)值、计数和求平均值等汇总运算,是数据分析的重要手段,但是,如果借助Excel本身自带的分类汇总以及数据透视功能来解决本文提出的问题,是无法完成这个任务的,它们只能呈现出各个类别(分组)的统计值,没法给出统计值所在数据行的完整数据信息。据此,我们探讨采用Python的Pandas库来实现,可有两种方法。
Python的Pandas库里有两个非常重要的数据结构:Series和DataFrame。其中,前者是一维的数据结构,后者是二维的、表格型的数据结构。可以把数据表数据读入程序以DataFrame类型表示,然后据此可以进行分组聚合以及筛选,最后形成最终结果。笔者调试实验程序是在Jupyter Notebook上进行的。Jupyter Notebook(交互式笔记本)是一个支持实时代码、数学方程、可视化和Markdown的Web应用程序,它支持四十多种计算机编程语言,对于数据分析来说,这个Web应用程序最大的优点是可以重现整个数据分析过程,并将说明文字、代码、图表、公式和结论都整合在一个文档里面,用户可以通过电子邮件(E-mail)、Dropbox、GitHub和Jupyter Notebook View将分析结果分享给其他人。
import pandas as pd # 导入pandas库
df = pd . read_excel ( ‘G : test1 . xlsx’) # 从存在盘上的Excel表读取数据到程序,变量df的数据类型为DataFrame
dm = df . groupby (‘组别’) . max ( ) #按照“组别”分组并聚合数据,筛选出各组最大值
dmax = pd . DataFrame ( ) # 新建一个DataFrame变量,以保存符合条件的行数据
# 循环语句,以dm行索引“组别”和列索引“完成次数”与原始数据集df匹配,以筛选出符合条件的数据行
foriindm . index:
m = df [ ( df [‘组别’]==I ) & ( df [‘完成次数’] = = dm [‘完成次数’] [ i ] ) ]
dmax = dmax . append ( m )
dmax # 打印输出结果数据集
运行该程序,得到各组完成次数最多的员工信息,如表2所示。
表2 各组完成次数最多的员工信息(方法一)
import pandas as pd #导入pandas库
df = pd . read _ excel (‘ G : test1 . xlsx ’) #从存在盘上的Excel表读取数据到程序,df的数据类型为DataFrame
dmax = df [df . groupby [‘组别’] . transform. max ( ) [‘完成次数’] = = df[‘完成次数’]]
dmax #打印输出结果数据集
运行该程序,得到各组完成次数最多的员工信息,如表3所示。
表3 各组完成次数最多的员工信息(方法二)
可以看出,两种方法运行程序得到的结果数据集是相同的,但相对方法一的程序,方法二里面的程序代码非常短小精炼。该程序应用到了transform()方法。一般来说,在对数据集进行聚合运算的时候,返回的数据集的形状(shape)与被分组数据集的形状是不同的,也就是说,一般返回的数据集的数据行数量小于原来数据集的数据行数量。如果希望保持与原来的数据集形状相同,那么可以通过transform()方法来实现。该方法的语法格式如下:
transform ( func , * args , ** kwargs )
上述方法中只有一个func参数,表示操作pandas对象的函数,比如,刚用到的max函数。transform()方法返回的结果有两种:①可以在本组列上进行广播的标量值(如max);②可以是与分组大小相同的结果数组。通过transform()方法操作分组时,transform()方法会把func函数应用到各个分组中,并且将结果放在适当的位置。如此,当进行筛选最值数据行时,不必使用循环遍历,通过两个等行数的数据集比较运算,得到等行数的新数据集,相应位置上的元素被赋予布尔类型的值,通过数据集的布尔索引,就获得了最终的最值数据行形成的新数据集,这就是我们想要的结果集。
数据处理分析是海量数据里寻找发现信息规律的重要手段。Pandas是一款基于numpy、专门为了解决数据分析任务的工具、作为Python的一个重要的库,其间不仅纳入了大量的库和一些标准的数据模型,而且提供了高效操作大型数据集所需的工具,被广泛应用到许多领域,包括经济、统计和分析等学术及商业领域。笔者通过使用Python的Pandas库的编程方式对结合数据分组统计“最值”记录问题进行了研究,得出了优化的程序实现方法。通过研究发现,采用编程方式,运用具有专业的数据处理分析特长的Python语言及Pandas库,能解决看似复杂的数据处理分析问题。我们应该重视一些看起来平凡无奇的方法,如transform()方法,如能被合理地运用,就可以减省大量程序代码,让程序更精炼强悍、运行起来效率更高。