📊【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()
函數!
🤝 七、期待與你共同進步
??🌱 親愛的讀者,非常感謝你每一次的停留和閱讀!你的支持是我們前行的最大動力!🙏
??🌐 在這茫茫網海中,有你的關注,我們深感榮幸。你的每一次點贊👍、收藏🌟、評論💬和關注💖,都像是明燈一樣照亮我們前行的道路,給予我們無比的鼓舞和力量。🌟
??📚 我們會繼續努力,為你呈現更多精彩和有深度的內容。同時,我們非常歡迎你在評論區留下你的寶貴意見和建議,讓我們共同進步,共同成長!💬
??💪 無論你在編程的道路上遇到什么困難,都希望你能堅持下去,因為每一次的挫折都是通往成功的必經之路。我們期待與你一起書寫編程的精彩篇章! 🎉
??🌈 最后,再次感謝你的厚愛與支持!愿你在編程的道路上越走越遠,收獲滿滿的成就和喜悅!祝你編程愉快!🎉