網站首頁 編程語言 正文
groupby()函數
在python的DataFrame中對數據進行分組統計主要使用groupby()函數。
1. groupby基本用法
1.1 一級分類_分組求和
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() # 分組統計求和 print(df1)
1.2 二級分類_分組求和
給groupby()傳入一個列表,列表中的元素為分類字段,從左到右分類級別增大。(一級分類、二級分類…)
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() # 分組統計求和 print(df1)
1.3 對DataFrameGroupBy對象列名索引(對指定列統計計算)
其中,df.groupby(‘class_1’)得到一個DataFrameGroupBy對象,對該對象可以使用列名進行索引,以對指定的列進行統計。
如: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)
代碼運行結果同上。
2. 對分組數據進行迭代
2.1 對一級分類的DataFrameGroupBy對象進行遍歷
for name, group in DataFrameGroupBy_object
其中,name指分類的類名,group指該類的所有數據。
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("===============================") # 獲取目標數據。 df1 = df[['name', 'class_1', 'num']] for name, group in df1.groupby('class_1'): print(name) print("=============================") print(group) print("==================================================")
2.2 對二級分類的DataFrameGroupBy對象進行遍歷
對二級分類的DataFrameGroupBy對象進行遍歷,
以for (key1, key2), group in df.groupby([‘class_1’, ‘class_2’]) 為例
不同于一級分類的是, (key1, key2)是一個由多級類別組成的元組,而group表示該多級分類類別下的數據。
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("==================================================")
程序運行結果如下:
(部分)
3. agg()函數
使用groupby()函數和agg()函數 實現 分組聚合操作運算。
3.1一般寫法_對目標數據使用同一聚合函數
以 分組求均值、求和 為例
給agg()傳入一個列表
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 對不同列使用不同聚合函數
給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("===============================") df1 = df[['class_1', 'num1', 'num2']] print(df1.groupby('class_1').agg({'num1': ['mean', 'sum'], 'num2': ['sum']}))
3.3 自定義函數寫法
也可以自定義一個函數(以名為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__ = "類別數量最多" df1 = df.agg({'class_1': [max1], 'num1': ['sum', 'mean'], 'num2': ['sum', 'mean']}) print(df1)
4. 通過 字典 和 Series 對象進行分組統計
groupy()不僅僅可以傳入單個列,或多個列組成的列表,
也可以傳入一個字典或者一個Series來實現分組。
4.1通過一個字典
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產品產量', 'b產品產量', 'c產品產量', '搬運工數量', '推銷員數量', '經理數量', '平均工資'] 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產品產量': '產品產量', 'b產品產量': '產品產量', 'c產品產量': '產品產量', '搬運工數量': '人員數量', '推銷員數量': '人員數量', '經理數量': '人員數量', '平均工資': '平均工資' } df1 = df.groupby(mapping, axis=1).sum() print(df1)
程序運行結果:
4.2通過一個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產品產量', 'b產品產量', 'c產品產量', '搬運工數量', '推銷員數量', '經理數量', '平均工資'] 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產品產量': '產品產量', 'b產品產量': '產品產量', 'c產品產量': '產品產量', '搬運工數量': '人員數量', '推銷員數量': '人員數量', '經理數量': '人員數量', '平均工資': '平均工資' } s1 = pd.Series(data) df1 = df.groupby(s1, axis=1).sum() print(df1)
程序運行結果:
參考資源: python數據分析從入門到精通 明日科技編著 清華大學出版社
原文鏈接:https://skylarkprogramming.blog.csdn.net/article/details/123331058
相關推薦
- 2023-05-12 Python?pandas?的索引方式?data.loc[],data[][]示例詳解_python
- 2022-12-12 pycharm?console?打印中文為亂碼問題及解決_python
- 2022-05-25 Python中PyAutoGUI幫助文檔(推薦!)_python
- 2022-11-11 C++?左值引用與一級指針示例詳解_C 語言
- 2022-10-28 C++異步操作future和aysnc與function和bind_C 語言
- 2022-08-22 C++動態規劃算法實現矩陣鏈乘法_C 語言
- 2023-01-29 Python使用pandas導入xlsx格式的excel文件內容操作代碼_python
- 2022-05-15 asyncio異步編程之Task對象詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支