python?DataFrame數(shù)據(jù)分組統(tǒng)計(jì)groupby()函數(shù)的使用
groupby()函數(shù)
在python的DataFrame中對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)主要使用groupby()函數(shù)。
1. groupby基本用法
1.1 一級(jí)分類_分組求和
import pandas as pd data = [['a', 'A', 109], ['b', 'B', 112], ['c', 'A', 125], ['d', 'C', 120], ['e', 'C', 126], ['f', 'B', 133], ['g', 'A', 124], ['h', 'B', 134], ['i', 'C', 117], ['j', 'C', 128]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] columns = ['name', 'class', 'num'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("=================================================") df1 = df.groupby('class').sum() # 分組統(tǒng)計(jì)求和 print(df1)
1.2 二級(jí)分類_分組求和
給groupby()傳入一個(gè)列表,列表中的元素為分類字段,從左到右分類級(jí)別增大。(一級(jí)分類、二級(jí)分類…)
import pandas as pd data = [['a', 'A', '1等', 109], ['b', 'B', '1等', 112], ['c', 'A', '1等', 125], ['d', 'B', '2等', 120], ['e', 'B', '1等', 126], ['f', 'B', '2等', 133], ['g', 'A', '2等', 124], ['h', 'B', '1等', 134], ['i', 'A', '2等', 117], ['j', 'A', '2等', 128], ['h', 'A', '1等', 130], ['i', 'B', '2等', 122]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("=================================================") df1 = df.groupby(['class_1', 'class_2']).sum() # 分組統(tǒng)計(jì)求和 print(df1)
1.3 對(duì)DataFrameGroupBy對(duì)象列名索引(對(duì)指定列統(tǒng)計(jì)計(jì)算)
其中,df.groupby(‘class_1’)得到一個(gè)DataFrameGroupBy對(duì)象,對(duì)該對(duì)象可以使用列名進(jìn)行索引,以對(duì)指定的列進(jìn)行統(tǒng)計(jì)。
如:df.groupby(‘class_1’)[‘num’].sum()
import pandas as pd data = [['a', 'A', '1等', 109], ['b', 'B', '1等', 112], ['c', 'A', '1等', 125], ['d', 'B', '2等', 120], ['e', 'B', '1等', 126], ['f', 'B', '2等', 133], ['g', 'A', '2等', 124], ['h', 'B', '1等', 134], ['i', 'A', '2等', 117], ['j', 'A', '2等', 128], ['h', 'A', '1等', 130], ['i', 'B', '2等', 122]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("=================================================") df1 = df.groupby('class_1')['num'].sum() print(df1)
代碼運(yùn)行結(jié)果同上。
2. 對(duì)分組數(shù)據(jù)進(jìn)行迭代
2.1 對(duì)一級(jí)分類的DataFrameGroupBy對(duì)象進(jìn)行遍歷
for name, group in DataFrameGroupBy_object
其中,name指分類的類名,group指該類的所有數(shù)據(jù)。
import pandas as pd data = [['a', 'A', '1等', 109], ['b', 'C', '1等', 112], ['c', 'A', '1等', 125], ['d', 'B', '2等', 120], ['e', 'B', '1等', 126], ['f', 'B', '2等', 133], ['g', 'C', '2等', 124], ['h', 'A', '1等', 134], ['i', 'C', '2等', 117], ['j', 'A', '2等', 128], ['h', 'B', '1等', 130], ['i', 'C', '2等', 122]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("===============================") # 獲取目標(biāo)數(shù)據(jù)。 df1 = df[['name', 'class_1', 'num']] for name, group in df1.groupby('class_1'): print(name) print("=============================") print(group) print("==================================================")
2.2 對(duì)二級(jí)分類的DataFrameGroupBy對(duì)象進(jìn)行遍歷
對(duì)二級(jí)分類的DataFrameGroupBy對(duì)象進(jìn)行遍歷,
以for (key1, key2), group in df.groupby([‘class_1’, ‘class_2’]) 為例
不同于一級(jí)分類的是, (key1, key2)是一個(gè)由多級(jí)類別組成的元組,而group表示該多級(jí)分類類別下的數(shù)據(jù)。
import pandas as pd data = [['a', 'A', '1等', 109], ['b', 'C', '1等', 112], ['c', 'A', '1等', 125], ['d', 'B', '2等', 120], ['e', 'B', '1等', 126], ['f', 'B', '2等', 133], ['g', 'C', '2等', 124], ['h', 'A', '1等', 134], ['i', 'C', '2等', 117], ['j', 'A', '2等', 128], ['h', 'B', '1等', 130], ['i', 'C', '2等', 122]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("===============================") for (key1, key2), group in df.groupby(['class_1', 'class_2']): print(key1, key2) print("=============================") print(group) print("==================================================")
程序運(yùn)行結(jié)果如下:
(部分)
3. agg()函數(shù)
使用groupby()函數(shù)和agg()函數(shù) 實(shí)現(xiàn) 分組聚合操作運(yùn)算。
3.1一般寫法_對(duì)目標(biāo)數(shù)據(jù)使用同一聚合函數(shù)
以 分組求均值、求和 為例
給agg()傳入一個(gè)列表
df1.groupby([‘class_1’, ‘class_2’]).agg([‘mean’, ‘sum’])
import pandas as pd data = [['a', 'A', '1等', 109, 144], ['b', 'C', '1等', 112, 132], ['c', 'A', '1等', 125, 137], ['d', 'B', '2等', 120, 121], ['e', 'B', '1等', 126, 136], ['f', 'B', '2等', 133, 127], ['g', 'C', '2等', 124, 126], ['h', 'A', '1等', 134, 125], ['i', 'C', '2等', 117, 125], ['j', 'A', '2等', 128, 133], ['h', 'B', '1等', 130, 122], ['i', 'C', '2等', 122, 111]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num1', 'num2'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("===============================") df1 = df[['class_1', 'class_2', 'num1', 'num2']] print(df1.groupby(['class_1', 'class_2']).agg(['mean', 'sum']))
3.2 對(duì)不同列使用不同聚合函數(shù)
給agg()方法傳入一個(gè)字典
import pandas as pd data = [['a', 'A', '1等', 109, 144], ['b', 'C', '1等', 112, 132], ['c', 'A', '1等', 125, 137], ['d', 'B', '2等', 120, 121], ['e', 'B', '1等', 126, 136], ['f', 'B', '2等', 133, 127], ['g', 'C', '2等', 124, 126], ['h', 'A', '1等', 134, 125], ['i', 'C', '2等', 117, 125], ['j', 'A', '2等', 128, 133], ['h', 'B', '1等', 130, 122], ['i', 'C', '2等', 122, 111]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num1', 'num2'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("===============================") df1 = df[['class_1', 'num1', 'num2']] print(df1.groupby('class_1').agg({'num1': ['mean', 'sum'], 'num2': ['sum']}))
3.3 自定義函數(shù)寫法
也可以自定義一個(gè)函數(shù)(以名為max1為例)傳入agg()中。
import pandas as pd data = [['a', 'A', '1等', 109, 144], ['b', 'C', '1等', 112, 132], ['c', 'A', '1等', 125, 137], ['d', 'B', '2等', 120, 121], ['e', 'B', '1等', 126, 136], ['f', 'B', '2等', 133, 127], ['g', 'C', '2等', 124, 126], ['h', 'A', '1等', 134, 125], ['i', 'C', '2等', 117, 125], ['j', 'A', '2等', 128, 133], ['h', 'B', '1等', 130, 122], ['i', 'C', '2等', 122, 111]] index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] columns = ['name', 'class_1', 'class_2', 'num1', 'num2'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df) print("===============================") max1 = lambda x: x.value_counts(dropna=False).index[0] max1.__name__ = "類別數(shù)量最多" df1 = df.agg({'class_1': [max1], 'num1': ['sum', 'mean'], 'num2': ['sum', 'mean']}) print(df1)
4. 通過(guò) 字典 和 Series 對(duì)象進(jìn)行分組統(tǒng)計(jì)
groupy()不僅僅可以傳入單個(gè)列,或多個(gè)列組成的列表,
也可以傳入一個(gè)字典或者一個(gè)Series來(lái)實(shí)現(xiàn)分組。
4.1通過(guò)一個(gè)字典
import pandas as pd data = [['A', 10000, 20121, 14521, 20, 23, 4, 5000], ['B', 12000, 12541, 11220, 14, 25, 5, 6000], ['C', 21420, 26452, 34215, 25, 24, 4, 5266], ['D', 21025, 23155, 31251, 23, 26, 6, 6452], ['E', 30021, 23512, 21452, 30, 27, 5, 7525], ['F', 32152, 30214, 26321, 32, 30, 7, 6952]] columns = ['公司', 'a產(chǎn)品產(chǎn)量', 'b產(chǎn)品產(chǎn)量', 'c產(chǎn)品產(chǎn)量', '搬運(yùn)工數(shù)量', '推銷員數(shù)量', '經(jīng)理數(shù)量', '平均工資'] pd.set_option('display.unicode.east_asian_width', True) df = pd.DataFrame(data=data, columns=columns) df = df.set_index(['公司']) print(df) print("===============================") mapping = { 'a產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', 'b產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', 'c產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', '搬運(yùn)工數(shù)量': '人員數(shù)量', '推銷員數(shù)量': '人員數(shù)量', '經(jīng)理數(shù)量': '人員數(shù)量', '平均工資': '平均工資' } df1 = df.groupby(mapping, axis=1).sum() print(df1)
程序運(yùn)行結(jié)果:
4.2通過(guò)一個(gè)Series
import pandas as pd data = [['A', 10000, 20121, 14521, 20, 23, 4, 5000], ['B', 12000, 12541, 11220, 14, 25, 5, 6000], ['C', 21420, 26452, 34215, 25, 24, 4, 5266], ['D', 21025, 23155, 31251, 23, 26, 6, 6452], ['E', 30021, 23512, 21452, 30, 27, 5, 7525], ['F', 32152, 30214, 26321, 32, 30, 7, 6952]] columns = ['公司', 'a產(chǎn)品產(chǎn)量', 'b產(chǎn)品產(chǎn)量', 'c產(chǎn)品產(chǎn)量', '搬運(yùn)工數(shù)量', '推銷員數(shù)量', '經(jīng)理數(shù)量', '平均工資'] pd.set_option('display.unicode.east_asian_width', True) df = pd.DataFrame(data=data, columns=columns) df = df.set_index(['公司']) print(df) print("===============================") data = { 'a產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', 'b產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', 'c產(chǎn)品產(chǎn)量': '產(chǎn)品產(chǎn)量', '搬運(yùn)工數(shù)量': '人員數(shù)量', '推銷員數(shù)量': '人員數(shù)量', '經(jīng)理數(shù)量': '人員數(shù)量', '平均工資': '平均工資' } s1 = pd.Series(data) df1 = df.groupby(s1, axis=1).sum() print(df1)
程序運(yùn)行結(jié)果:
參考資源: python數(shù)據(jù)分析從入門到精通 明日科技編著 清華大學(xué)出版社
到此這篇關(guān)于python DataFrame數(shù)據(jù)分組統(tǒng)計(jì)groupby()函數(shù)的使用的文章就介紹到這了,更多相關(guān)python DataFrame groupby() 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python項(xiàng)目以docker形式打包部署詳細(xì)流程
Docker是一個(gè)開源項(xiàng)目,為開發(fā)人員和系統(tǒng)管理員提供了一個(gè)開放平臺(tái),可以將應(yīng)用程序構(gòu)建、打包為一個(gè)輕量級(jí)容器,并在任何地方運(yùn)行,這篇文章主要給大家介紹了關(guān)于python項(xiàng)目以docker形式打包部署的詳細(xì)流程,需要的朋友可以參考下2024-08-08python實(shí)現(xiàn)的希爾排序算法實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的希爾排序算法,實(shí)例分析了基于Python實(shí)現(xiàn)希爾排序的相關(guān)技巧,需要的朋友可以參考下2015-07-07python搭建服務(wù)器實(shí)現(xiàn)兩個(gè)Android客戶端間收發(fā)消息
這篇文章主要為大家詳細(xì)介紹了python搭建服務(wù)器實(shí)現(xiàn)兩個(gè)Android客戶端間收發(fā)消息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python實(shí)現(xiàn)模擬時(shí)鐘代碼推薦
本文給大家匯總介紹了下使用Python實(shí)現(xiàn)模擬時(shí)鐘的代碼,一共3個(gè)例子,后兩個(gè)是基于QT實(shí)現(xiàn),有需要的小伙伴可以參考下2015-11-11Python實(shí)現(xiàn)希爾排序,歸并排序和桶排序的示例代碼
希爾、歸并、快速排序算法可歸為同一類,它們的共同點(diǎn)都是建立在分治思想之上。把大問(wèn)題分拆成小問(wèn)題,解決所有小問(wèn)題后,再合并每一個(gè)小問(wèn)題的結(jié)果,最終得到對(duì)原始問(wèn)題的解答。本文將介紹這三種算法的實(shí)現(xiàn)代碼,需要的可以參考一下2022-04-04Python進(jìn)程Multiprocessing模塊原理解析
這篇文章主要介紹了Python進(jìn)程Multiprocessing模塊原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02