Pandas之groupby( )用法筆記


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給得又少,參數也不給得很清楚,不過沒有辦法,還是只能選擇原諒他。

groupby我用過的用法

基本用法我這里就不呈現了,我覺得用過一次的人基本不會忘記,這里我主要寫一下我用過的關系groupby函數的疑惑:

apply & agg

這個問題着實困擾了我很久,經過研究,找了一些可能幫助理解的東西。先舉一個例子:

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的數據表,然而agg()則每次只傳入一列。

不過我覺得這一點區別在實際應用中分別並不大,因為Ipython的Out輸出對於這兩個函數幾乎沒有差別,不管是處理一列還是一表。

我覺得agg()有一點讓我很開心就是他可以同時傳入多個函數,簡直不要太方便哈哈:

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總是呈現透視表的形式,如:

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,是一個我可能沒注意過的一個東西,可是后來我發現,這不過是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()`函數:
Muldf.xs('LI')
  B C
A    
1 1.0 3.0
2 1.0 6.0

 

PS:有個問題困擾好久了,怎么把multiindex對象變回原來的形式呢。如:

Q      A    
LI     1    1.0
LI     2    1.0
WANG   2    2.0
ZHANG  1   -0.5

求大佬解答,感激不盡~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM