任何分組(groupby)操作都涉及原始對象的以下操作之一。它們是
- 分割對象
- 應用一個函數
- 結合的結果
在許多情況下,將數據分成多個集合,並在每個子集上應用一些函數。在應用函數中,可以執行以下操作
- 聚合 - 計算匯總統計
- 轉換 - 執行一些特定於組的操作
- 過濾 - 在某些情況下丟棄數據
下面來看看創建一個DataFrame對象並對其執行所有操作:
import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2], 'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017], 'Points':[876,789,863,673,741,812,756,788,694,701,804,690]} df = pd.DataFrame(ipl_data)
將數據拆分成組
Pandas對象可以分成任何對象。有多種方式來拆分對象,如
- obj.groupby(‘key’)
- obj.groupby([‘key1’,’key2’])
- obj.groupby(key,axis=1)
現在來看看如何將分組對象應用於DataFrame對象
df.groupby('Year')
查看分組
df.groupby('Team').groups
按多列分組
df.groupby(['Team','Year']).groups
選擇一個分組
使用get_group()
方法,可以選擇一個組。例如:
grouped.get_group(2014)
聚合
聚合函數為每個組返回單個聚合值。當創建了分組(group by)對象,就可以對分組數據執行多個聚合操作。
一個比較常用的是通過聚合或等效的agg
方法聚合:
grouped['Points'].agg(np.mean)
另一種查看每個分組的大小的方法是應用size()
函數:
import numpy as np grouped.agg(np.size)
一次應用多個聚合函數
通過分組系列,還可以傳遞函數的列表或字典來進行聚合,並生成DataFrame
作為輸出
agg = grouped['Points'].agg([np.sum, np.mean, np.std])
轉換
分組或列上的轉換返回索引大小與被分組的索引相同的對象。因此,轉換應該返回與組塊大小相同的結果。
grouped = df.groupby('Team') score = lambda x: (x - x.mean()) / x.std()*10
print (grouped.transform(score))
過濾
過濾根據定義的標准過濾數據並返回數據的子集。filter()
函數用於過濾數據。
filter = df.groupby('Team').filter(lambda x: len(x) >= 3)