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官方文檔的這種表達形式,讓人真的有點摸不著頭腦,example給得又少,參數(shù)也不給得很清楚,不過沒有辦法,還是只能選擇原諒他。
groupby我用過的用法
基本用法我這里就不呈現(xià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ū)別在實際應用中分別并不大,因為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
這個也是我剛剛學會的,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
我開始甚至以為這應該不是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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 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()的用法詳解
相關文章
python實現(xiàn)給微信公眾號發(fā)送消息的方法
這篇文章主要介紹了python實現(xiàn)給微信公眾號發(fā)送消息的方法,結(jié)合實例形式分析了Python針對微信公眾號接口操作的相關技巧,需要的朋友可以參考下2017-06-06

