pandas groupby + unstack的使用說明
概述
groupby()可以根據(jù)DataFrame中的某一列或者多列內(nèi)容進(jìn)行分組聚合,當(dāng)DataFrame聚合后為兩列索引時,可以使用unstack()將聚合的兩列中一列值調(diào)整為行索引,另一列的值調(diào)整為列索引。
代碼說明
test_df = pd.DataFrame({ 'col_1':['a', 'a', 'b', 'a', 'a', 'b', 'c', 'a', 'c'], 'col_2':['d', 'd', 'd', 'e', 'f', 'e', 'd', 'f', 'f'], 'col_3':[ 1, 2, 3, 1, 4, 5, 6, 4, 5]})
1.僅對數(shù)據(jù)進(jìn)行分組聚合
df1=test_df.groupby(['col_1', 'col_2']).count() df1: col_3 col_1 col_2 a d 2 e 1 f 2 b d 1 e 1 c d 1 f 1 df.index: MultiIndex(levels=[['a', 'b', 'c'], ['d', 'e', 'f']], labels=[[0, 0, 0, 1, 1, 2, 2], [0, 1, 2, 0, 1, 0, 2]], names=['col_1', 'col_2']) df1.columns: Index(['col_3'], dtype='object')
2.對分組聚合后的數(shù)據(jù)進(jìn)行unstack
df2=test_df.groupby(['col_1', 'col_2']).count().unstack() df2: col_3 col_2 d e f col_1 a 2.0 1.0 2.0 b 1.0 1.0 NaN c 1.0 NaN 1.0 df2.index: Index(['a', 'b', 'c'], dtype='object', name='col_1') df2.columns: MultiIndex(levels=[['col_3'], ['d', 'e', 'f']], labels=[[0, 0, 0], [0, 1, 2]], names=[None, 'col_2'])
3.對分組聚合后的某列進(jìn)行unstack
df3=test_df.groupby(['col_1', 'col_2']).count()['col_3'].unstack() df3: col_2 d e f col_1 a 2.0 1.0 2.0 b 1.0 1.0 NaN c 1.0 NaN 1.0 df.index: Index(['a', 'b', 'c'], dtype='object', name='col_1') de.columns: Index(['d', 'e', 'f'], dtype='object', name='col_2')
補充:pandas中pivot()方法和groupby()方法的說明和對比
pandas中有兩個很有用的方法,pivot()或者pivot_table()和groupby(),其中pivot()方法是指定相應(yīng)的列分別作為行標(biāo)簽和列標(biāo)簽,并指定相應(yīng)的列作為值,然后重新生成一個新的DataFrame對象,這樣的好處是使得數(shù)據(jù)更加的直觀和容易分析,俗稱數(shù)據(jù)透視;而groupby()方法是指定相應(yīng)的列進(jìn)行分組,把這列中具有相同值的行分為同一組,這個過程稱為分組,返回一個groupby對象,一般的,分組之后會伴有聚合運算,即對每組進(jìn)行需要的聚合運算(比如求和求積等)。
因此,pivot()方法是為了讓數(shù)據(jù)重新排列組合,使其更直觀,數(shù)據(jù)透視;而groupby()方法則是對數(shù)據(jù)進(jìn)行分組聚合運算;兩者實際上功能特點很明顯,并沒有什么可比性,只是在利用這兩種方法時,原數(shù)據(jù)的結(jié)構(gòu)是有些相似的,僅此而已;anyway,本文硬是把兩者放在一起比較確實有些牽強的。
但實際上本文的目的是通過使用這兩種不同的方法達(dá)成一個相同的目的,由此明晰兩種方法的用法和優(yōu)劣勢,并由此更好的掌握它們。
首先我們構(gòu)造一個DataFrame對象,如圖。
其中reindex方法是為了調(diào)換name和date兩列的順序。
現(xiàn)在我們有一個目標(biāo)是去計算每個人在所有日期的總的value,對此,我們先用pivot()方法看看如何實現(xiàn)。
如下圖,首先對df1利用pivot()方法進(jìn)行重新排列,具體的參數(shù)如圖,以name為行標(biāo)簽,date為列標(biāo)簽,values為值,其中在原表中沒有對應(yīng)值,則顯示NaN。
經(jīng)過重新排列,我們可以很直觀的看出在原表中name和data兩列對應(yīng)值的對應(yīng)關(guān)系,這更有助于我們分析name、date、values這三列的關(guān)系,這才是pivot()方法的主要功能。
當(dāng)然,對于我們最初的目標(biāo),我們可以通過對NaN填充0值,然后再對每列求和即可,即df2.sum(axis=1)。
然后,我們再用groupby()方法來實現(xiàn)我們的目標(biāo),具體代碼如圖。
這里,我們只要對name列進(jìn)行分組,得到分組后的groupby對象,然后再對values列進(jìn)行求和,最后就會返回每個名字對應(yīng)的總的value。
通過以上論述,可知要達(dá)成我們的最初的目標(biāo),顯然groupby()方法要簡單的多,這當(dāng)然是由于pivot()和grouby()的功能特性所決定的,因為這本來就是groupby()所擅長的。
這里用pivot()來實現(xiàn)我們的目標(biāo)雖然是可以,但是明顯大材小用了。
我們通過這些例子就是想說明兩者的用法,以及不同的功能特點,以此更好的掌握和理解這兩種方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
- pandas groupby分組對象的組內(nèi)排序解決方案
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計函數(shù)agg()的使用
- pandas之分組groupby()的使用整理與總結(jié)
- Pandas之groupby( )用法筆記小結(jié)
- 利用Pandas和Numpy按時間戳將數(shù)據(jù)以Groupby方式分組
- Pandas GroupBy對象 索引與迭代方法
- 淺談pandas用groupby后對層級索引levels的處理方法
- pandas獲取groupby分組里最大值所在的行方法
- Pandas groupby apply agg 的區(qū)別 運行自定義函數(shù)說明
相關(guān)文章
Python numpy.power()函數(shù)使用說明
這篇文章主要介紹了Python numpy.power()函數(shù)使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python+OpenCV實現(xiàn)分水嶺分割算法的示例代碼
分水嶺算法是用于分割的經(jīng)典算法,在提取圖像中粘連或重疊的對象時特別有用。本文將用Python+OpenCV實現(xiàn)這一算法,需要的可以參考一下2022-08-08解決Python找不到ssl模塊問題 No module named _ssl的方法
這篇文章主要介紹了解決Python找不到ssl模塊問題 No module named _ssl的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04python實現(xiàn)循環(huán)語句1到100累和
這篇文章主要介紹了python循環(huán)語句1到100累和方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python?time時間格式化和設(shè)置時區(qū)實現(xiàn)代碼詳解
這篇文章主要介紹了Python?time時間格式化和設(shè)置時區(qū)實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值2023-02-02python 讀取文本文件的行數(shù)據(jù),文件.splitlines()的方法
今天小編就為大家分享一篇python 讀取文本文件的行數(shù)據(jù),文件.splitlines()的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07