成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL、Pandas和Spark:如何實現數據透視表?

數據庫 其他數據庫 Spark
今天本文就圍繞數據透視表,介紹一下其在SQL、Pandas和Spark中的基本操作與使用,這也是沿承這一系列的文章之一。

 01 數據透視表簡介

數據透視表,顧名思義,就是通過對數據執行一定的"透視",完成對復雜數據的分析統計功能,常常伴隨降維的效果。例如在Excel工具欄數據透視表選項卡中通過懸浮鼠標可以看到這樣的描述:

在上述簡介中,有兩個關鍵詞值得注意:排列和匯總,其中匯總意味著要產生聚合統計,即groupby操作;排列則實際上隱含著使匯總后的結果有序。當然,如果說只實現這兩個需求還不能完全表達出數據透視表與常規的groupby有何區別,所以不妨首先看個例子:

給定經典的titanic數據集,我們需要統計不同性別下的生還人數,則可以進行如下設置:

而后,即可得到如下結果:

通過上表,明顯可以看出女性中約有2/3的人得以生還,而男性中則僅有不到20%的人得以生還。當然,這是數據透視表的最基本操作,大家應該也都熟悉,本文不做過多展開。

值得補充的是:實際上為了完成不同性別下的生還人數,我們完全可以使用groupby(sex, survived)這兩個字段+count實現這一需求,而數據透視表則僅僅是在此基礎上進一步完成行轉列的pivot操作而已。理解了數據透視表的這一核心功能,對于我們下面介紹數據透視表在三大工具中的適用將非常有幫助!

02 Pandas實現數據透視表

在三大工具中,Pandas實現數據透視表可能是最為簡單且又最能支持自定義操作的工具。首先,給出一個自定義的dataframe如下,僅構造name,sex,survived三個字段,示例數據如下:

基于上述數據集實現不同性別下的生還人數統計,運用pandas十分容易。這里給出Pandas中數據透視表的API介紹:

可以明顯注意到該函數的4個主要參數:

  •  values:對哪一列進行匯總統計,在此需求中即為name字段;
  •  index:匯總后以哪一列作為行,在此需求中即為sex字段;
  •  columns:匯總后以哪一列作為列,在此需求中即為survived;
  •  aggfunc:執行什么聚合函數,在此需求中即為count,該參數的默認參數為mean,但只適用于數值字段。

而后,分別傳入相應參數,得到數據透視表結果如下:

上述需求很簡單,需要注意以下兩點:

  •  pandas中的pivot_table還支持其他多個參數,包括對空值的操作方式等;
  •  上述數據透視表的結果中,無論是行中的兩個key("F"和"M")還是列中的兩個key(0和1),都是按照字典序排序的結果,這也呼應了Excel中關于數據透視表的介紹。

03 Spark實現數據透視表

Spark作為分布式的數據分析工具,其中spark.sql組件在功能上與Pandas極為相近,在某種程度上個人一直將其視為Pandas在大數據中的實現。在Spark中實現數據透視表的操作也相對容易,只是不如pandas中的自定義參數來得強大。

首先仍然給出在Spark中的構造數據:

而后,前面已分析過數據透視表的本質其實就是groupby操作+pivot,所以spark中剛好也就是運用這兩個算子協同完成數據透視表的操作,最后再配合agg完成相應的聚合統計。完整的實現數據透視表及其結果如下:

當然,注意到這里仍然是保持了數據透視表結果中行key和列key的有序。

04 SQL中實現數據透視表

這一系列的文章中,一般都是將SQL排在首位進行介紹,但本文在介紹數據透視表時有意將其在SQL中的操作放在最后,這是因為在SQL中實現數據透視表是相對最為復雜的。實際上,SQL中原生并不支持數據透視表功能,只能通過衍生操作來曲線達成需求。

上述在分析數據透視表中,將其定性為groupby操作+行轉列的pivot操作,那么在SQL中實現數據透視表就將需要groupby和行轉列兩項操作,所幸的是二者均可獨立實現,簡單組合即可。

仍然是在SQL中構造臨時數據表,如下:

而后我們采取逐步拆解的方式嘗試數據透視表的實現:

1. 利用groupby實現分組聚合統計,這一操作非常簡單:

2.對上述結果執行行轉列,實現數據透視表。這里,SQL中實現行轉列一般要配合case when,簡單的也可以直接使用if else實現。由于這里要轉的列字段只有0和1兩種取值,所以直接使用if函數即可:

上述SQL語句中,僅對sex字段進行groupby操作,而后在執行count(name)聚合統計時,由直接count聚合調整為兩個count條件聚合,即:

  •  如果survived字段=0,則對name計數,否則不計數(此處設置為null,因為count計數時會忽略null值),得到的結果記為survived=0的個數;
  •  如果survived字段=1,則對name計數,否則不計數,此時得到的結果記為survived=1的個數。

這樣,得到的結果就是最終要實現的數據透視表需求。

值得指出,這里通過if條件函數來對name列是否有實際取值+count計數實現聚合,實際上還可以通過if條件函數衍生1或0+sum求和聚合實現,例如:

當然,二者的結果是一樣的。

以上就是數據透視表在SQL、Pandas和Spark中的基本操作,應該講都還是比較方便的,僅僅是在SQL中需要稍加使用個小技巧。希望能對大家有所幫助,如果覺得有用不妨點個在看! 

 

責任編輯:龐桂玉 來源: 數據分析專欄
相關推薦

2020-05-09 10:38:31

Python透視表數據

2010-09-15 08:53:50

SQL Server

2024-11-26 08:00:00

SQLPandasPandaSQL

2021-04-09 23:00:12

SQL數據庫Pandas

2021-09-10 16:10:21

panda透視表語言

2011-07-08 13:40:18

2022-06-17 09:21:53

Pandas代碼透視表

2017-04-26 13:47:32

Java

2020-11-19 15:26:36

SQLPandas代碼

2016-07-14 16:15:02

大數據

2021-04-18 22:18:39

SQL數據分析工具

2020-08-03 12:26:22

數據透視函數公式

2018-03-21 11:05:26

Spark大數據應用程序

2010-07-01 14:46:10

SQL Server臨

2020-09-28 14:05:08

2010-10-22 16:48:49

SQL刪除所有表數據

2011-03-22 13:49:20

SQL Server數維度表事實表

2011-04-07 14:04:28

SQL動態交叉表

2021-08-12 08:00:00

Pandas數據分析SQL

2010-07-01 14:11:40

SQL Server內
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线 | 精品动漫一区 | 亚洲视频免费观看 | 国产一二区免费视频 | 久草免费在线视频 | 成人福利在线观看 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 久在线视频 | 玖玖爱365 | 日韩成人在线免费观看 | 亚洲精品一区国语对白 | av黄色片 | 亚洲一区二区三区免费 | 最近中文字幕第一页 | 91网站视频在线观看 | 国产精品一区在线观看你懂的 | 91久久精品日日躁夜夜躁欧美 | 不卡的av电影 | 午夜久久久 | 69av在线视频 | 久久精品国产一区二区电影 | 亚洲成人久久久 | 亚洲日本中文 | 日韩1区2区 | 午夜黄色影院 | 黄网站在线播放 | 亚洲二区在线 | 91精品欧美久久久久久久 | 国产精品久久福利 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 欧美8一10sex性hd | 欧美日韩成人在线观看 | 99pao成人国产永久免费视频 | 日本xx视频免费观看 | 欧美一区视频 | 国产精品一区在线观看你懂的 | 精品乱码一区二区 | 日本特黄a级高清免费大片 成年人黄色小视频 | 一区二区三区欧美在线 | 国产视频亚洲视频 | 色精品|