1. 程式人生 > >07資料聚合與分組運算

07資料聚合與分組運算

1.Groupy技術
核心思想:拆分-應用-合併
step1. pandas物件會根據你所提供的一個或多個鍵被拆分為多組;
step2. 將一個函式應用到各個分組併產生一個新值;
step3. 最後所有這些函式的執行結果會被合併到最終的結果物件中;

data=pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
print(data)
grouped=data[
'data1'].groupby(data['key1']) 這裡的grouped物件很有意思,是一個GroupBy物件,直觀上觀察不了,可以理解為一箇中間資料狀態。 print(grouped.count())

data1 data2 key1 key2
0 0.685550 -0.340121 a one
1 0.077146 -0.971889 a two
2 -0.271265 -0.633583 b one
3 1.023990 0.305369 b two
4 -0.220377 -2.929215 a one

key1
a 3
b 2
Name: data1, dtype: int6

需要明確的是,這裡的data[‘key1’]稱為分組鍵,實際上分組鍵可以是任何長度適當的陣列、列名、字典、函式等等。

2.資料聚合技術
所謂聚合,指的是任何能夠從陣列產生標量值的資料轉換過程。

從具體實現角度而言:GroupBy會高效地對目標資料進行切片,然後對各片呼叫指定的聚合函式,最後將這些結果組裝成最終結果。
2.1常用優化過的基本聚合函式:
    count()
    sum()
    mean()
    median()
    std、var()
    min()max()
    prod()
    first、last
2.2自己設計的聚合函式:
只需要將設計的聚合函式傳入aggregate或agg方法即可:
def peak_to_peak(arr):
    return
arr.max()-arr.min() grouped.agg(peak_to_peak)
2.3面向列的多函式應用
首先要明確的一點,要用的函式所針對的資料是什麼??
agg只負責呼叫目標函式,而前面基於groupby所選中的資料是作用的目標。
更具體的怎麼理解?就是說基於不同分組鍵分層劃分出的資料,是作為一個整體的資料塊來應用目標函式。
比如前面分組鍵用了sex和smoker這兩個,則相當於先基於sex,資料分為了male和female兩類,而後各類基於somker,又分
為TrueFalse兩個部分,這樣的話,最初的整個資料被劃分為4個數據塊.那麼後面利用agg引用的聚合函式將逐個作用在這4
個數據塊中具體的指定列上!!
因此一個聚合函式將產生4個結果,分別對應4個數據塊。

tips=pd.read_csv('ch08/tips.csv')
tips['tip_pct']=tips['tip']/tips['total_bill']
grouped=tips.groupby(['sex','smoker'])
grouped_pct=grouped['tip_pct']
grouped_pct.agg(['mean','std'])

注:對於產生的計算結果,可以採用自動給出的列名,這一般根據聚合函式的名字來確定,當然在傳給agg過程中,可以指定列名。
grouped_pct.agg([('fol','mean'),('std_value','std')])

對於不同的列使用不同的聚合函式,則給agg傳入字典形式即可:
grouped.agg({'tip':np.max,'size':'sum'})

3.分組級運算和轉換

1.transform方法
key=['one','two','one','two','one']
people.groupby(key).mean()
people.groupby(key).transform(np.mean)
怎麼理解transform??transform的作用是將一個函式應用到各個分組,然後將結果放置到合適的位置上:如果各分組產生的是
一個標量值,則該值將被廣播出去。
通俗上解釋,就是說對於前面基於groupby方法劃分出的資料塊,對每一個數據塊施加同一個函式,然後針對結果的形式,可以將計算結果
自動放入合適的位置。需要注意的是,傳入的函式是有嚴格要求的,其產生的結果只有兩種,一種是一個可以廣播的標量值,另一個是產生相同大小的結果陣列。
2.apply:一般性的“拆分-應用-合併”
apply是最一般化的groupby方法,apply會將待處理的物件拆分成多個片段,然後對各片段呼叫傳入的函式,最後嘗試將各片段組合到一起。
tips.groupby('smoker').apply(top)

本質上,在GroupBy中,當你呼叫諸如describe之類的方法時,實際上只是應用了下面的快捷方式而已:
f=lambda x:x.describe()
grouped.apply(f)