在日常的數(shù)據(jù)分析中,經(jīng)常需要將數(shù)據(jù)根據(jù)某個(多個)字段劃分為不同的群體(group)進行分析,如電商領(lǐng)域?qū)⑷珖目備N售額根據(jù)省份進行劃分,分析各省銷售額的變化情況,社交領(lǐng)域?qū)⒂脩舾鶕?jù)畫像(性別、年齡)進行細分,研究用戶的使用情況和偏好等。在Pandas中,上述的數(shù)據(jù)處理操作主要運用groupby完成,本文就介紹一下
groupby
的基本原理及對應(yīng)的
agg
、
transform
和
apply
等操作,總共包含25個代碼示例。
首先,模擬生成10個樣本數(shù)據(jù):
import pandas as pd
import numpy as np
company=["A","B","C"]
data=pd.DataFrame({
"company":[company[x] for x in np.random.randint(0,len(company),10)],
"salary":np.random.randint(5,50,10),
"age":np.random.randint(15,50,10)
}
)
1. Groupby的基本原理
在pandas中,實現(xiàn)分組操作的代碼很簡單,僅需一行代碼,在這里,將上面的數(shù)據(jù)集按照company
字段進行劃分:
這個生成的DataFrameGroupBy
是啥呢?對data進行了groupby后發(fā)生了什么?ipython所返回的結(jié)果是其內(nèi)存地址,并不利于直觀地理解,為了看看group內(nèi)部究竟是什么,這里把group轉(zhuǎn)換成list的形式來看一看:
轉(zhuǎn)換成列表的形式后,可以看到,列表由三個元組組成,每個元組中,第一個元素是組別(這里是按照company進行分組,所以最后分為了A,B,C),第二個元素的是對應(yīng)組別下的DataFrame,整個過程可以圖解如下:
總結(jié)來說,groupby的過程就是將原有的DataFrame按照groupby的字段(這里是company),劃分為若干個分組DataFrame,被分為多少個組就有多少個分組DataFrame。所以說,在groupby之后的一系列操作(如agg、apply等),均是基于子DataFrame的操作。理解了這點,也就基本摸清了Pandas中g(shù)roupby操作的主要原理。
2. agg聚合操作
聚合操作是groupby操作之后非常常見的操作。聚合操作可以用來求和、均值、最大值、最小值等,下面的表格列出了Pandas中常見的聚合操作。
針對樣例數(shù)據(jù)集,如果想求不同公司員工的平均年齡和平均薪水,可以按照下方的代碼進行:
如果想對針對不同的列求不同的值,比如要計算不同公司員工的平均年齡以及薪水的中位數(shù),可以利用字典進行聚合操作的指定:
agg聚合過程可以圖解如下(第二個例子為例):
3. transform
transform是一種什么數(shù)據(jù)操作?和agg有什么區(qū)別呢?為了更好地理解transform和agg的不同,下面從實際的應(yīng)用場景出發(fā)進行對比。
在上面的agg中,我們知道了如何求不同公司員工的平均薪水,如果現(xiàn)在需要在原數(shù)據(jù)集中新增一列avg_salary,代表員工所在的公司的平均薪水(相同公司的員工具有一樣的平均薪水),該怎么實現(xiàn)呢?如果按照正常的步驟來計算,需要先求得不同公司的平均薪水,然后按照員工和公司的對應(yīng)關(guān)系填充到對應(yīng)的位置,不用transform的話,實現(xiàn)代碼如下:
如果使用transform
的話,僅需要一行代碼:
還是以圖解的方式來看看進行g(shù)roupby后transform的實現(xiàn)過程(為了更直觀展示,圖中加入了company列,實際按照上面的代碼只有salary列):
圖中的大方框是transform和agg所不一樣的地方,對agg而言,會計算得到A,B,C公司對應(yīng)的均值并直接返回,但對transform而言,則會對每一條數(shù)據(jù)求得相應(yīng)的結(jié)果,同一組內(nèi)的樣本會有相同的值,組內(nèi)求完均值后會按照原索引的順序返回結(jié)果,如果有不理解的可以拿這張圖和agg那張對比一下。
4. apply
apply應(yīng)該是大家的老朋友了,它相比agg和transform而言更加靈活,能夠傳入任意自定義的函數(shù),實現(xiàn)復(fù)雜的數(shù)據(jù)操作。那么問題來了,在groupby后使用apply和groupby之前使用有什么區(qū)別呢?
區(qū)別是有的,但是整個實現(xiàn)原理是基本一致的。兩者的區(qū)別在于,對于groupby后的apply,以分組后的子DataFrame作為參數(shù)傳入指定函數(shù)的,基本操作單位是DataFrame,而之前介紹的apply的基本操作單位是Series。還是以一個案例來介紹groupby后的apply用法。
假設(shè)現(xiàn)在需要獲取各個公司年齡最大的員工的數(shù)據(jù),該怎么實現(xiàn)呢?可以用以下代碼實現(xiàn):
這樣便得到了每個公司年齡最大的員工的數(shù)據(jù),整個流程圖解如下:
最后,關(guān)于apply的使用,這里有個小建議,雖然說apply擁有更大的靈活性,但apply的運行效率會比agg和transform更慢。所以,groupby之后能用agg和transform解決的問題還是優(yōu)先使用這兩個方法,實在解決不了了才考慮使用apply進行操作。
5. 25個代碼示例
1. 單列聚合
計算出每個company的平均salary:
2. 多列聚合
在一個操作中進行多個聚合。下面是計算每個company的平均薪資和年齡:
注意,這里使用的是雙方括號“[[]]”。
3. 多方式聚合
使用agg函數(shù)來計算多個聚合值:
4. 對聚合結(jié)果進行命名
可以對聚合的結(jié)果進行命名:
5. 多個聚合和多個函數(shù)
6. 不同列的聚合進行命名
7. as_index參數(shù)
如果groupby操作的輸出是DataFrame,可以使用as_index參數(shù)使它們成為DataFrame中的一列。
8. 用于分組的多列
就像可以聚合多個列一樣,也可以使用多個列進行分組。
sales.groupby(["store","product_group"], as_index=False).agg(avg_sales = ("last_week_sales", "mean")).head()
9. 排序輸出
可以使用sort_values
函數(shù)根據(jù)聚合列對輸出進行排序.
sales.groupby(["store","product_group"], as_index=False).agg(avg_sales = ("last_week_sales", "mean")).sort_values(by='avg_sales', ascending=False).head()
10. 最大的Top N
max函數(shù)返回每個組的最大值。如果需要n個最大的值,可以用下面的方法:
11. 最小的Top N
與最大值相似,也可以求最小值
12. 第n個值
還可以找到一組中的第n個值,例如,找到每個company中年齡第2的薪水:
13. 第n個值,倒排序
也可以用負的第n項。例如," nth(-2) "返回從末尾開始的第二行。
14. 唯一值
unique
函數(shù)可用于查找每組中唯一的值。例如,可以找到每個company中唯一的年齡,代碼如下:
15. 唯一值的數(shù)量
可以使用nunique函數(shù)找到每組中唯一值的數(shù)量:
16. Lambda表達式
可以在agg函數(shù)中使用lambda表達式作為自定義聚合操作。
17. apply函數(shù)
使用apply函數(shù)將Lambda表達式應(yīng)用到每個組,如下所示:
18. dropna
缺省情況下,groupby
函數(shù)忽略缺失值。如果用于分組的列中缺少一個值,那么它將不包含在任何組中,也不會單獨顯示。所以可以使用dropna參數(shù)來改變這個行為。
首先添加一個缺少存儲值的新行:
然后計算帶有dropna參數(shù)和不帶有dropna參數(shù)的每個company的平均age,以查看差異。
19. 求組的個數(shù)
有時需要知道生成了多少組,這可以使用ngroups
:
20. 獲得一個特定分組
get_group
函數(shù)可獲取特定組并且返回DataFrame。
21. rank函數(shù)
rank
函數(shù)用于根據(jù)給定列中的值為行分配秩??梢允褂胷ank和groupby函數(shù)分別對每個組中的行進行排序。
22. 累計操作
可以計算出每組的累計總和:
先創(chuàng)建一個示例dataframe:
然后單獨創(chuàng)建一個列,包含值列的累計總和,如下所示:
23. expanding函數(shù)
expanding
函數(shù)提供展開轉(zhuǎn)換。但是對于展開以后的操作還是需要一個累計函數(shù)來對其操作。例如它與cumsum 函數(shù)一起使用,結(jié)果將與與sum函數(shù)相同。
24. 累積平均
利用展開函數(shù)和均值函數(shù)計算累積平均:文章來源:http://www.zghlxwxcb.cn/news/detail-776836.html
25. 展開后的最大值
可以使用expand和max函數(shù)記錄組當前最大值:
在Pandas中g(shù)roupby函數(shù)與aggregate函數(shù)共同構(gòu)成了高效的數(shù)據(jù)分析工具。文章來源地址http://www.zghlxwxcb.cn/news/detail-776836.html
參考資料
- 超好用的Groupby用法詳解
- 25個例子學(xué)會Pandas Groupby 操作
- 數(shù)據(jù)處理三板斧——map、apply、applymap詳解
到了這里,關(guān)于【Python】Pandas Groupby操作的25個示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!