pandas的groupby是數(shù)據(jù)處理中一個非常強大的功能。雖然很多同學已已經(jīng)非常熟悉了,但有些小技巧還是要和大家普及一下的。為了給大家演示,我們采用一個公開的數(shù)據(jù)集進行說明。
import pandas as pd
iris = pd.read_csv
隨機采樣5條,數(shù)據(jù)是長這樣子的。
》》》 iris.sample(5)
sepal_length sepal_width petal_length petal_width species
95 5.7 3.0 4.2 1.2 versicolor
71 6.1 2.8 4.0 1.3 versicolor
133 6.3 2.8 5.1 1.5 virginica
4 5.0 3.6 1.4 0.2 setosa
33 5.5 4.2 1.4 0.2 setosa
因為是分組功能,所以被分的對象肯定是類別型的。在這個數(shù)據(jù)里,這里我們就以species進行分組舉例。
首先,以species分組創(chuàng)建一個groupby的object。這里單獨生成groupby對象是因為后面會反復(fù)用到,其實用的熟練了直接鏈接起來就可以了。
iris_gb = iris.groupby(‘species’)
一、創(chuàng)建頻率表假如我想知道每個species類中的數(shù)量有多少,那么直接使用groupby的size函數(shù)即可,如下。
》》》 iris_gb.size()
species
setosa 50
versicolor 50
virginica 50
dtype: int64
二、計算常用的描述統(tǒng)計量比如,我想要按組計算均值,那么就用mean()函數(shù)。
》》》 # 計算均值
》》》 iris_gb.mean()
sepal_length sepal_width petal_length petal_width
species
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
默認情況下如果沒有限制,那么mean()函數(shù)將對所有變量特征計算均值。如果我希望只計算某一個變量的均值,可以指定該變量,如下所示。
》》》 # 單列
》》》 iris_gb[‘sepal_length’].mean()
species
setosa 5.006
versicolor 5.936
virginica 6.588
Name: sepal_length, dtype: float64
》》》 # 雙列
》》》 iris_gb[[‘sepal_length’, ‘petal_length’]].mean()
sepal_length petal_length
species
setosa 5.006 1.462
versicolor 5.936 4.260
virginica 6.588 5.552
同理,其它描述性統(tǒng)計量min、max()、medianhe和std都是一樣的用法。
三、查找最大值(最小值)索引如果我們要查找每個組的最大值或最小值的索引時,有一個方便的功能可以直接使用。
》》》 iris_gb.idxmax()
sepal_length sepal_width petal_length petal_width
species
setosa 14 15 24 43
versicolor 50 85 83 70
virginica 131 117 118 100
如何應(yīng)用呢?
比如我們想查找每組sepal_length最大值對應(yīng)的整條記錄時,就可以這樣用。注意,這里是整條記錄,相當于按sepal_length最大值這個條件進行了篩選。
》》》 sepal_largest = iris.loc[iris_gb[‘sepal_length’].idxmax()]
》》》 sepal_largest
sepal_length sepal_width petal_length petal_width species
14 5.8 4.0 1.2 0.2 setosa
50 7.0 3.2 4.7 1.4 versicolor
131 7.9 3.8 6.4 2.0 virginica
四、Groupby之后重置索引很多時候,我們在groupby處理后還要進行其他操作。也就是說,我們想重置分組索引以使其成為正常的行和列。
第一種方法可能大家常用,就是通過reset_index()讓亂序索引重置。
》》》 iris_gb.max().reset_index()
species sepal_length sepal_width petal_length petal_width
0 setosa 5.8 4.4 1.9 0.6
1 versicolor 7.0 3.4 5.1 1.8
2 virginica 7.9 3.8 6.9 2.5
但其實,還有一個看上去更加友好的用法??梢栽趃roupby的時候就設(shè)置as_index參數(shù),也可以達到同樣效果。
》》》 iris.groupby(‘species’, as_index=False).max()
species sepal_length sepal_width petal_length petal_width
0 setosa 5.8 4.4 1.9 0.6
1 versicolor 7.0 3.4 5.1 1.8
2 virginica 7.9 3.8 6.9 2.5
五、多種統(tǒng)計量匯總上面都是單個統(tǒng)計量的操作,那如果我想同時操作好幾個呢?
groupby還有一個超級棒的用法就是和聚合函數(shù)agg連起來使用。
》》》 iris_gb[[‘sepal_length’, ‘petal_length’]].agg([“min”, “mean”])
sepal_length petal_length
min mean min mean
species
setosa 4.3 5.006 1.0 1.462
versicolor 4.9 5.936 3.0 4.260
virginica 4.9 6.588 4.5 5.552
在agg里面,我們只要列出統(tǒng)計量的名稱即可,便可同時對每個列進行多維度統(tǒng)計。
六、特定列的聚合我們也看到了,上面是的多個操作對于每個列都是一樣的。實際使用過程中,我們可能對于每個列的需求都是不一樣的。
所以在這種情況下,我們可以通過為不同的列單獨設(shè)置不同的統(tǒng)計量。
》》》 iris_gb.agg({“sepal_length”: [“min”, “max”], “petal_length”: [“mean”, “std”]})
sepal_length petal_length
min max mean std
species
setosa 4.3 5.8 1.462 0.173664
versicolor 4.9 7.0 4.260 0.469911
virginica 4.9 7.9 5.552 0.551895
7、NamedAgg命名統(tǒng)計量現(xiàn)在我又有新的想法了。上面的多級索引看起來有點不太友好,我想把每個列下面的統(tǒng)計量和列名分別合并起來??梢允褂肗amedAgg來完成列的命名。
》》》 iris_gb.agg(
。。. sepal_min=pd.NamedAgg(column=“sepal_length”, aggfunc=“min”),
。。. sepal_max=pd.NamedAgg(column=“sepal_length”, aggfunc=“max”),
。。. petal_mean=pd.NamedAgg(column=“petal_length”, aggfunc=“mean”),
。。. petal_std=pd.NamedAgg(column=“petal_length”, aggfunc=“std”)
。。. )
sepal_min sepal_max petal_mean petal_std
species
setosa 4.3 5.8 1.462 0.173664
versicolor 4.9 7.0 4.260 0.469911
virginica 4.9 7.9 5.552 0.551895
因為NamedAgg是一個元組,所以我們也可以直接賦值元組給新的命名,效果一樣,但看上去更簡潔。
iris_gb.agg(
sepal_min=(“sepal_length”, “min”),
sepal_max=(“sepal_length”, “max”),
petal_mean=(“petal_length”, “mean”),
petal_std=(“petal_length”, “std”)
)
八、使用自定義函數(shù)上面agg聚合函數(shù)中我們都是通過添加一個統(tǒng)計量名稱來完成操作的,除此之外我們也可直接給一個功能對象。
》》》 iris_gb.agg(pd.Series.mean)
sepal_length sepal_width petal_length petal_width
species
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
不僅如此,名稱和功能對象也可一起使用。
iris_gb.agg([“min”, pd.Series.mean])
更騷的是,我們還可以自定義函數(shù),也都是可以的。
》》》 def double_length(x):
。。. return 2*x.mean()
。。.
》》》 iris_gb.agg(double_length)
sepal_length sepal_width petal_length petal_width
species
setosa 10.012 6.856 2.924 0.492
versicolor 11.872 5.540 8.520 2.652
virginica 13.176 5.948 11.104 4.052
當然如果想更簡潔,也可以使用lambda函數(shù)??傊?,用法非常靈活,可以自由組合搭配。
iris_gb.agg(lambda x: x.mean())
以上就是使用groupby過程中可能會用到的8個操作,如果你熟練使用起來會發(fā)現(xiàn)這個功能是真的很強大。
原文標題:Pandas 100 個騷操作:groupby 8 個常用技巧!
文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責任編輯:haq
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4337瀏覽量
62730 -
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
605瀏覽量
28592
原文標題:Pandas 100 個騷操作:groupby 8 個常用技巧!
文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論