当前位置: 首页 > 科技观察

SQL、Pandas和Spark:如何实现数据透视表?

时间:2023-03-12 14:20:59 科技观察

01透视表简介透视表,顾名思义,就是通过对数据进行一定的“透视”来完成复杂数据的分析统计,往往伴随着降维的效果。例如,将鼠标悬停在Excel工具栏的数据透视表选项卡中,可以看到这样的描述:在上面的介绍中,有两个关键字值得注意:arrangement和summary,其中summary的意思是生成汇总统计,即groupby操作;排列实际上意味着对聚合结果进行排序。当然,如果仅仅实现这两个需求,还不能完全表达数据透视表和常规groupby的区别,不妨先看一个例子:给定经典的titanic数据集,我们需要统计不同性别下的幸存者人数,可以做如下设置:那么,可以得到如下结果:从上表可以清楚的看出,大约2/3的女性幸存下来,而只有不到20%的人幸免于难。当然,这是数据透视表最基本的操作,大家应该都不陌生。本文不会过多展开。值得补充的是,其实为了完成不同性别下的幸存者数量,我们可以使用groupby(sex,survived)+count这两个字段来实现这个需求,而pivot表只是在此基础上进一步完成basis只是行到列的pivot操作。了解数据透视表的核心功能,对于我们在下面介绍数据透视表在三大工具中的应用会有很大的帮助!02Pandas实现数据透视表三大工具中,Pandas实现数据透视表可能是最简单,支持自定义操作最多的工具。首先给出一个自定义的dataframe如下,只构造了name、sex、survived三个字段。样本数据如下:基于以上数据集,可以很容易的使用pandas实现不同性别下幸存者的统计。下面是Pandas中数据透视表的API介绍:可以清楚的注意到这个函数的4个主要参数:values:对哪一列进行汇总统计,就是这个需求中的name字段;index:summaryrow之后的哪一列作为summary,就是这个需求中的sex字段;columns:哪一列作为汇总后的列,在本次需求中保留下来;aggfunc:执行什么聚合函数,在这个需求中是count,这个参数默认是mean,但是只针对数值字段。然后分别传入相应的参数,pivot表的结果如下:上面的需求很简单,需要注意以下两点:pandas中的pivot_table还支持其他多个参数,包括运算空值的方法等;上面的数据透视表结果中,无论是行中的两个键(“F”和“M”)还是列中的两个键(0和1),都是按照字典顺序排序的,这也呼应了Excel关于透视表的介绍。03Spark实现数据透视表Spark是一个分布式数据分析工具,spark.sql组件在功能上和Pandas非常相似。某种程度上,我一直把它看做是Pandas在大数据方面的实现。在Spark中实现数据透视表操作也比较容易,但是没有pandas中的自定义参数强大。首先还是给出了Spark中的结构数据:那么之前分析过数据透视表的本质其实就是groupby操作+pivot,所以在spark中就是利用这两个算子来配合完成对pivot的操作pivottable,最后再配合agg完成相应的聚合统计。数据透视表的完整实现及其结果如下:当然,注意这里仍然保持数据透视表结果中行键和列键的顺序。04在用SQL实现数据透视表的系列文章中,一般先介绍SQL,但本文在介绍数据透视表时有意将其在SQL中的操作放在最后,因为在SQL中实现相对来说是最复杂的中的数据透视表。事实上,SQL本身并不支持数据透视表功能,只能通过求导运算对曲线来满足要求。在上面的透视表分析中,它的特点是一个groupby操作+一个行转列的pivot操作,那么用SQL实现一个pivot表就需要groupby和行转列两个操作.好在两者都可以独立实现,简单的结合起来。临时数据表仍然是用SQL构建的,如下:那么我们尝试通过分步拆解的方式来实现数据透视表:1.使用groupby实现分组聚合统计。这个操作很简单:2.将上述结果列进行行转换,实现数据透视表。这里SQL中行到列转换的实现一般需要配合casewhen,也可以直接使用ifelse来实现。由于这里要传递的列字段只有0和1两个值,所以可以直接使用if函数:在上面的SQL语句中,只对sex字段进行了groupby操作,然后当count(name)进行聚合统计,直接将count聚合调整为两次count条件聚合,即:如果survived字段=0,则统计名字,否则不统计(这里设置为null,因为count会忽略null值计数时),结果记录为survived=0的个数;如果survived字段=1,则统计名字,否则不统计,此时得到的结果记为survived的数量=1。这样得到的结果就是最终要实现的数据透视表需求。值得指出的是,这里使用了if条件函数来聚合name列是否有实际值+count计数。其实if条件函数也可以用来推导出1或者0+sum聚合。例如:当然,两者的结果是一样的。以上就是SQL、Pandas、Spark中数据透视表的基本操作。应该说还是挺方便的,就是SQL里面需要一点小技巧。希望对大家有所帮助。如果您觉得有用,不妨点击观看!