Pandas之groupby( )用法筆記小結(jié)
groupby官方解釋
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
Group series using mapper (dict or key function, apply given function to group, return result as series) or by a series of columns.
講真的,非常不能理解pandas官方文檔的這種表達(dá)形式,讓人真的有點摸不著頭腦,example給得又少,參數(shù)也不給得很清楚,不過沒有辦法,還是只能選擇原諒他。
groupby我用過的用法
基本用法我這里就不呈現(xiàn)了,我覺得用過一次的人基本不會忘記,這里我主要寫一下我用過的關(guān)系groupby函數(shù)的疑惑:
apply & agg
這個問題著實困擾了我很久,經(jīng)過研究,找了一些可能幫助理解的東西。先舉一個例子:
import pandas as pd df = pd.DataFrame({'Q':['LI','ZHANG','ZHANG','LI','WANG'], 'A' : [1,1,1,2,2], 'B' : [1,-1,0,1,2], 'C' : [3,4,5,6,7]})
A | B | C | Q | |
---|---|---|---|---|
0 | 1 | 1 | 3 | LI |
1 | 1 | -1 | 4 | ZHANG |
2 | 1 | 0 | 5 | ZHANG |
3 | 2 | 1 | 6 | LI |
4 | 2 | 2 | 7 | WANG |
df.groupby('Q').apply(lambda x:print(x))
A B C Q
0 1 1 3 LI
3 2 1 6 LI
A B C Q
0 1 1 3 LI
3 2 1 6 LI
A B C Q
4 2 2 7 WANG
A B C Q
1 1 -1 4 ZHANG
2 1 0 5 ZHANG
df.groupby('Q').agg(lambda x:print(x))
0 1
3 2
Name: A, dtype: int64
4 2
Name: A, dtype: int64
1 1
2 1
Name: A, dtype: int64
0 1
3 1
Name: B, dtype: int64
4 2
Name: B, dtype: int64
1 -1
2 0
Name: B, dtype: int64
0 3
3 6
Name: C, dtype: int64
4 7
Name: C, dtype: int64
1 4
2 5
Name: C, dtype: int64
A | B | C | |
---|---|---|---|
Q | |||
LI | None | None | None |
WANG | None | None | None |
ZHANG | None | None | None |
從這個例子可以看出,使用apply()處理的對象是一個個的類如DataFrame的數(shù)據(jù)表,然而agg()則每次只傳入一列。
不過我覺得這一點區(qū)別在實際應(yīng)用中分別并不大,因為Ipython的Out輸出對于這兩個函數(shù)幾乎沒有差別,不管是處理一列還是一表。
我覺得agg()有一點讓我很開心就是他可以同時傳入多個函數(shù),簡直不要太方便哈哈:
df.groupby('Q').agg(['mean','std','count','max'])
A | B | C | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
mean | std | count | max | mean | std | count | max | mean | std | count | max | |
Q | ||||||||||||
LI | 1.5 | 0.707107 | 2 | 2 | 1.0 | 0.000000 | 2 | 1 | 4.5 | 2.121320 | 2 | 6 |
WANG | 2.0 | NaN | 1 | 2 | 2.0 | NaN | 1 | 2 | 7.0 | NaN | 1 | 7 |
ZHANG | 1.0 | 0.000000 | 2 | 1 | -0.5 | 0.707107 | 2 | 0 | 4.5 | 0.707107 | 2 | 5 |
Plotting
這個也是我剛剛學(xué)會的,groupby的plot簡直不要太方便了:(不過這個例子選的不是很好)
%matplotlib inline df.groupby('Q').agg(['mean','std','count','max']).plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x1133bd710>
MultiIndex
這個是困擾我最多的一個問題,因為如果我groupby的時候選擇了兩個level,之后的data總是呈現(xiàn)透視表的形式,如:
Muldf = df.groupby(['Q','A']).agg('mean') print(Muldf)
B C
Q A
LI 1 1.0 3.0
2 1.0 6.0
WANG 2 2.0 7.0
ZHANG 1 -0.5 4.5
我開始甚至以為這應(yīng)該不是dataframe,是一個我可能沒注意過的一個東西,可是后來我發(fā)現(xiàn),這不過是MultiIndex形式的一種dataframe罷了。
Muldf.B
Q A
LI 1 1.0
2 1.0
WANG 2 2.0
ZHANG 1 -0.5
Name: B, dtype: float64
如果要選擇某一個index,用`xs()`函數(shù):
Muldf.xs('LI')
B | C | |
---|---|---|
A | ||
1 | 1.0 | 3.0 |
2 | 1.0 | 6.0 |
PS:有個問題困擾好久了,怎么把multiindex對象變回原來的形式呢。如:
Multiindex格式如下:(a, b, c, ...),
index | column |
(a1,b1,c1) | d1 |
(a2,b2,c2) | d2 |
直接調(diào)用函數(shù)reset_index(),Multiindex中(a, b, c, ...)就變成columns了,index重置為(0,1,2,...), 如下:
index | column | |||
0 | a1 | b1 | c1 | d1 |
1 | a2 | b2 | c2 | d2 |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- pandas獲取groupby分組里最大值所在的行方法
- pandas之分組groupby()的使用整理與總結(jié)
- pandas groupby 分組取每組的前幾行記錄方法
- 淺談pandas用groupby后對層級索引levels的處理方法
- pandas groupby分組對象的組內(nèi)排序解決方案
- 利用Pandas和Numpy按時間戳將數(shù)據(jù)以Groupby方式分組
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計函數(shù)agg()的使用
- Pandas中GroupBy具體用法詳解
- Pandas中的 transform()結(jié)合 groupby()用法示例詳解
- pandas中pd.groupby()的用法詳解
相關(guān)文章
python自定義函數(shù)實現(xiàn)最大值的輸出方法
今天小編就為大家分享一篇python自定義函數(shù)實現(xiàn)最大值的輸出方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python2實現(xiàn)的LED大數(shù)字顯示效果示例
這篇文章主要介紹了Python2實現(xiàn)的LED大數(shù)字顯示效果,涉及Python的簡單交互與列表相關(guān)使用技巧,需要的朋友可以參考下2017-09-09Python寫一個字符串?dāng)?shù)字后綴部分的遞增函數(shù)
這篇文章主要介紹了Python寫一個字符串?dāng)?shù)字后綴部分的遞增函數(shù),寫函數(shù)之前需要Python處理重名字符串,添加或遞增數(shù)字字符串后綴,下面具體過程,需要的小伙伴可以參考一下2022-03-03