【Python】進階學習:pandas--groupby()用法詳解

📊【Python】進階學習:pandas–groupby()用法詳解

在這里插入圖片描述

🌈 個人主頁:高斯小哥
🔥 高質量專欄:Matplotlib之旅:零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程👈 希望得到您的訂閱和支持~
💡 創作高質量博文(平均質量分92+),分享更多關于深度學習、PyTorch、Python領域的優質內容!(希望得到您的關注~)


🌵文章目錄🌵

  • 🤔 一、為什么需要groupby()?
  • 🎯 二、groupby()的基本用法
  • 📈 三、聚合運算
  • 🛠? 四、高級用法與技巧
    • 🔧 應用自定義函數
    • 🔄 數據轉換
    • 🔍 過濾數據
  • 🛠? 五、實際案例應用
  • 🎉 六、總結
  • 🤝 七、期待與你共同進步

??👋 歡迎來到Python進階學習之旅!今天,我們將深入探討pandas庫中非常強大的groupby()函數。groupby()函數在數據分析和數據清洗中發揮著關鍵作用,能夠幫助我們輕松地對數據進行分組、聚合和轉換。

🤔 一、為什么需要groupby()?

??在處理大量數據時,我們經常需要按照某個或多個特征對數據進行分組,以便更好地理解數據的結構和關系。例如,我們可能希望按照年份、地區或產品類別對數據進行分組,并對每個組進行聚合運算,如求和、平均值、最大值等。這時,groupby()函數就顯得非常有用。

🎯 二、groupby()的基本用法

??首先,我們需要導入pandas庫,并創建一個示例數據集。然后,我們可以使用groupby()函數按照指定的列對數據進行分組。

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的GroupBy對象
print(grouped)

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B2C070B8E0>

??上述代碼將按照列’A’的值對DataFrame進行分組,并返回一個GroupBy對象。我們可以進一步對這個對象進行聚合運算。

📈 三、聚合運算

??GroupBy對象提供了多種聚合函數,如sum()mean()max()等。我們可以使用這些函數對每個組進行聚合運算。

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的對象
print(grouped)# 計算每個組的平均值
mean_grouped = grouped.mean()
print(mean_grouped)# 計算每個組的總和
sum_grouped = grouped.sum()
print(sum_grouped)

輸出:

            C         D
A                      
bar  0.658173 -0.225388
foo  0.778100 -0.164148C         D
A                     
bar  1.97452 -0.676164
foo  3.89050 -0.820740

??除了內置的聚合函數外,我們還可以使用agg()函數應用自定義的聚合函數。例如,我們可以計算每個組的標準差:

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的對象
print(grouped)# 計算每個組的標準差
std_grouped = grouped.agg(np.std)
print(std_grouped)

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B2F480B880>C         D
A                      
bar  0.101229  0.274698
foo  0.996597  0.812362

🛠? 四、高級用法與技巧

??除了基本的分組和聚合操作外,groupby()還提供了許多高級功能,如應用自定義函數、轉換數據等。

🔧 應用自定義函數

??我們可以使用apply()方法應用自定義函數到每個組。例如,我們可以定義一個函數來計算每個組的最大值和最小值之差:

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的對象
print(grouped)# 定義一個自定義函數,計算每個組的最大值和最小值之差
def range_diff(group):return group.max() - group.min()# 使用apply()應用自定義函數
diff_grouped = grouped.apply(range_diff)
print(diff_grouped)

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002ACBD83AA60>C         D
A                      
bar  2.497695  1.086924
foo  2.826518  2.063781

🔄 數據轉換

??groupby()還提供了transform()方法,用于將聚合運算的結果廣播到原始數據的每一行。這在數據轉換中非常有用。

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的對象
print(grouped)# 使用transform()方法將每個組的平均值廣播到原始數據的每一行
mean_transformed = grouped['C'].transform('mean')
print(mean_transformed)# 將轉換后的平均值添加到原始DataFrame中
df['C_mean'] = mean_transformed
print(df)

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000188A56DA8E0>
0    0.344876
1   -1.358760
2    0.344876
3   -1.358760
4    0.344876
5   -1.358760
6    0.344876
7    0.344876
Name: C, dtype: float64A         C         D    C_mean
0  foo  0.783914 -1.027288  0.344876
1  bar -2.072893 -0.972087 -1.358760
2  foo  0.035637 -0.315908  0.344876
3  bar -1.953068  0.409697 -1.358760
4  foo  0.576048 -0.258289  0.344876
5  bar -0.050318 -1.115734 -1.358760
6  foo  0.093456  0.106227  0.344876
7  foo  0.235322  1.365150  0.344876

🔍 過濾數據

??除了聚合和轉換外,我們還可以使用filter()方法根據條件過濾出滿足條件的組。

import numpy as np
import pandas as pd# 創建一個簡單的DataFrame
data = {'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],'C': np.random.randn(8),'D': np.random.randn(8)
}
df = pd.DataFrame(data)# 使用groupby按列'A'進行分組
grouped = df.groupby('A')# 打印分組后的對象
print(grouped)# 使用filter()方法過濾出滿足條件的組(例如,組的大小大于3)
filtered_groups = grouped.filter(lambda x: len(x) > 3)
print(filtered_groups)

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000015ADE2FA940>A         C         D
0  foo  1.967217  0.005976
2  foo  0.950149  0.098143
4  foo  0.568101  1.461587
6  foo -1.905337 -1.106591
7  foo -0.168686  0.692850

🛠? 五、實際案例應用

??最后,讓我們通過一個實際案例來演示如何應用groupby()函數進行數據分析和清洗。

??假設我們有一個包含銷售數據的DataFrame,其中包含日期、地區、產品名稱、銷售額等列。我們希望按地區和產品名稱對數據進行分組,并計算每個組的總銷售額。

import numpy as np
import pandas as pd# 創建一個包含銷售數據的DataFrame
sales_data = {'date': pd.date_range(start='2023-01-01', periods=100),'region': np.random.choice(['North', 'South', 'East', 'West'], size=100),'product': np.random.choice(['Product A', 'Product B', 'Product C'], size=100),'sales': np.random.rand(100) * 1000
}
df_sales = pd.DataFrame(sales_data)# 按地區和產品名稱對數據進行分組,并計算總銷售額
grouped_sales = df_sales.groupby(['region', 'product'])['sales'].sum().reset_index()# 打印分組后的銷售額
print(grouped_sales)

輸出:

   region    product        sales
0    East  Product A  2728.679432
1    East  Product B  1847.966730
2    East  Product C  4518.356763
3   North  Product A  5882.374531
4   North  Product B  5519.364196
5   North  Product C  4229.953852
6   South  Product A  5303.784425
7   South  Product B  2321.080682
8   South  Product C  4239.002167
9    West  Product A  1689.650513
10   West  Product B  4002.790867
11   West  Product C  4894.553548

??在這個案例中,我們首先創建了一個包含銷售數據的DataFrame。然后,我們使用groupby()函數按地區和產品名稱對數據進行分組,并使用sum()函數計算每個組的總銷售額。最后,我們使用reset_index()函數將結果轉換為一個新的DataFrame,并打印出來。

🎉 六、總結

??groupby()函數是pandas庫中一個非常強大的工具,它允許我們按照一個或多個特征對數據進行分組,并對每個組進行聚合、轉換和過濾操作。通過熟練掌握groupby()函數的用法,我們可以更高效地處理和分析大量數據,從而洞察數據的內在結構和關系。希望這篇博客能夠幫助你更好地理解和應用groupby()函數!

🤝 七、期待與你共同進步

??🌱 親愛的讀者,非常感謝你每一次的停留和閱讀!你的支持是我們前行的最大動力!🙏

??🌐 在這茫茫網海中,有你的關注,我們深感榮幸。你的每一次點贊👍、收藏🌟、評論💬和關注💖,都像是明燈一樣照亮我們前行的道路,給予我們無比的鼓舞和力量。🌟

??📚 我們會繼續努力,為你呈現更多精彩和有深度的內容。同時,我們非常歡迎你在評論區留下你的寶貴意見和建議,讓我們共同進步,共同成長!💬

??💪 無論你在編程的道路上遇到什么困難,都希望你能堅持下去,因為每一次的挫折都是通往成功的必經之路。我們期待與你一起書寫編程的精彩篇章! 🎉

??🌈 最后,再次感謝你的厚愛與支持!愿你在編程的道路上越走越遠,收獲滿滿的成就和喜悅!祝你編程愉快!🎉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python算法100例-3.5 親密數

1.問題描述2.問題分析3.算法設計4.確定程序框架5.完整的程序6.問題拓展 1&#xff0e;問題描述 如果整數A的全部因子&#xff08;包括1&#xff0c;不包括A本身&#xff09;之和等于B&#xff0c;且整數B的全部因子&#xff08;包括1&#xff0c;不包括B本身&#xff09;之和…

中國電子學會2020年6月份青少年軟件編程Sc ratch圖形化等級考試試卷四級真題。

第 1 題 【 單選題 】 1.執行下面程序&#xff0c;輸入4和7后&#xff0c;角色說出的內容是&#xff1f; A&#xff1a;4&#xff0c;7 B&#xff1a;7&#xff0c;7 C&#xff1a;7&#xff0c;4 D&#xff1a;4&#xff0c;4 2.執行下面程序&#xff0c;輸出是&#xff…

Oracle自帶的網絡工具(計算傳輸redo需要的帶寬,使用STATSPACK,計算redo壓縮率,db_ultra_safe)

--根據primary database redo產生的速率,計算傳輸redo需要的帶寬. 除去tcp/ip網絡其余30%的開銷,計算需要的帶寬公式: 需求帶寬((每秒產生redo的速率峰值/0.75)*8)/1,000,000帶寬(Mbps) --可以通過去多次業務高峰期的Statspack/AWR獲取每秒產生redo的速率峰值,也可以通過查詢視…

post請求體內容無法重復獲取

post請求體內容無法重復獲取 為什么會無法重復讀取呢&#xff1f; 以tomcat為例&#xff0c;在進行請求體讀取時實際底層調用的是org.apache.catalina.connector.Request的getInputStream()方法&#xff0c;而該方法返回的是CoyoteInputStream輸入流 public ServletInputStream…

CVE-2016-5195 復現記錄

文章目錄 poc前置知識頁表與缺頁異常/proc/self/mem的寫入流程madvise 漏洞點修復 Dirty COW臟牛漏洞是一個非常有名的Linux競爭條件漏洞&#xff0c;雖然早在2016年就已經被修復&#xff0c;但它依然影響著眾多古老版本的Linux發行版&#xff0c;如果需要了解Linux的COW&#…

Redis7 實現持久化的三種方式

1、概述 1.1、Redis持久化的重要性 數據恢復&#xff1a;Redis是一個內存數據庫&#xff0c;如果系統或服務宕機&#xff0c;內存中的數據將會丟失。Redis的持久化機制可以把數據保存到磁盤上&#xff0c;以便在系統重啟后恢復數據。這是Redis持久化最基本也是最重要的功能。…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ? COND CODE&#xff0c;就是反映JCL中STEP運行狀態的參數&#xff0c;JCL正常終了的COND CODE 是0000&#xff0c;另外筆者在執行某些工具JCL時候&#xff0c;比方說簡單一個COMPARE吧&#xff0c;可能會出現0012、0004或者0016&#xff0c;0001&#xf…

JSON與Object等的相互轉換

JSON與Object的轉換 // 將 Object 對象轉換為 String 類型 String jsonString = JSON.toJSONString(body);// 將 String 或 byte[] 轉換為 JSONObject 類型 JSONObject jsonObject = JSONObject.parseObject(jsonString); // 根據鍵key獲取 JSONObject 中的某一個鍵值對的值 S…

數據結構:棧和隊列的實現附上源代碼(C語言版)

目錄 前言 1.棧 1.1 棧的概念及結構 1.2 棧的底層數據結構選擇 1.2 數據結構設計代碼&#xff08;棧的實現&#xff09; 1.3 接口函數實現代碼 &#xff08;1&#xff09;初始化棧 &#xff08;2&#xff09;銷毀棧 &#xff08;3&#xff09;壓棧 &#xff08;4&…

金三銀四求職攻略:如何在面試中脫穎而出

隨著春天的腳步漸近&#xff0c;對于眾多程序員來說&#xff0c;一年中最繁忙、最重要的時期也隨之而來。金三銀四&#xff0c;即三月和四月&#xff0c;被廣大程序員視為求職的黃金時段。在這段時間里&#xff0c;各大公司紛紛開放招聘&#xff0c;求職者們則通過一場又一場的…

初階數據結構之---棧和隊列(C語言)

引言 在順序表和鏈表那篇博客中提到過&#xff0c;棧和隊列也屬于線性表 線性表&#xff1a; 線性表&#xff08;linear list&#xff09;是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構。線性表在邏輯上是線性結構&#xff0c;也就是說是連…

xxl-job--02--可視化界面各功能詳細介紹

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 可視化界面1 新增執行器2.新增任務**執行器**&#xff1a;**任務描述**&#xff1a;**路由策略**&#xff1a;**Cron**&#xff1a;cron表達式**運行模式**JobHandl…

01.18 校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、校招 | 中國航天科工四院四部2024春季校園招聘 校招 | 中國航天科工四院四部2024春季校園招聘 2、阿里集團24屆秋招「空缺崗位」大盤點 校招 | 阿里集團24屆校招補錄大盤點&#xff0…

全量知識系統問題及SmartChat給出的答復 之15 幣圈生態鏈

Q40. 今天聊聊關于幣圈和幣圈生態方面&#xff0c;尤其是在建立和保護各種幣圈生態鏈的問題。 主要包括各種主體、 各種權益 和 各種幣及其幣圈的 分類&#xff0c;包括 概念、關系和 鏈接和斷鏈的判斷根據等等&#xff0c; 是否有一個比較清晰的體系結構呢&#xff1f; 因為現…

java Springboot vue 健身房系統,簡單練手項目

該項目主要分為管理員和會員模塊 管理員具有&#xff1a;會員管理&#xff0c;器材管理,員工管理&#xff0c;健身課程管理 會員模塊&#xff0c;可以在線報名健身課程&#xff0c;查看自己課程 采用VUE前端開發和springboot后端開發&#xff0c;極簡代碼編寫&#xff0c;沒…

融資項目——登錄接口的開發

1. 首先創建登錄與用戶信息VO類。 Data ApiModel(description "登陸對象") public class LoginVO {ApiModelProperty("手機號")private String mobile;ApiModelProperty("密碼")private String password;ApiModelProperty("用戶類型"…

藍橋每日一題 (差分)3月3號

//3279改變數組元素 自己做TLE&#xff1a;奈何想不出怎么用差分 #include<bits/stdc.h> using namespace std; //3279 改變數組元素&#xff08;超時&#xff09; const int N2e510; vector<int>a; int t,n; int main() {cin>>t;while(t--){cin>>n;…

ubuntu20.04安裝docker及運行

ubuntu20.04安裝docker及運行 ubuntu環境版本 Ubuntu Focal 20.04 (LTS) 查看系統版本 rootubuntu20043:~# cat /proc/version Linux version 5.15.0-78-generic (builddlcy02-amd64-008) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, GNU ld (GNU Binutils for Ubuntu) …

Vue(黑馬學習筆記)

Vue概述 通過我們學習的htmlcssjs已經能夠開發美觀的頁面了&#xff0c;但是開發的效率還有待提高&#xff0c;那么如何提高呢&#xff1f;我們先來分析下頁面的組成。一個完整的html頁面包括了視圖和數據&#xff0c;數據是通過請求從后臺獲取的那么意味著我們需要將后臺獲取…

通過XML調用CAPL腳本進行測試(新手向)

目錄 0 引言 1 XML簡介 2 通過XML調用CAPL腳本 0 引言 紀念一下今天這個特殊日子&#xff0c;四年出現一次的29號。 在CANoe中做自動化測試常用的編程方法有CAPL和XML兩種&#xff0c;二者各有各的特色&#xff0c;對于CAPL來說新手肯定是更熟悉一些&#xff0c;因為說到在C…