pandas之分組聚合(agg,apply)
阿新 • • 發佈:2020-09-18
Pandas分組聚合 - 高階
自定義聚合方式
在分組聚合的split-apply-combine過程中,apply是核心。Python 本身有高階函式 apply() 來實現它
自定義聚合方式:aggregate(),或agg()
之前的聚合方式,所有列只能應用一個相同的聚合函式
agg()自定義聚合方式的優勢:
聚合引數是列表 對資料每列應用多個相同的聚合函式 聚合引數是字典 對資料的每列應用一個或多個不同的聚合函式 聚合引數是自定義函式 對資料進行一些複雜的操作 agg 方法將一個函式使用在一個數列上,然後返回一個標量的值。也就是說agg每次傳入的是一列資料,對其聚合後返回標量
自定義聚合方式可以:
每個列應用不同的聚合方式
一個列應用多個聚合方式
df = pd.DataFrame({ 'name': ['張三','李四','王五','李四','王五','王五','趙六'], 'chinese': [18, 53, 67, 63, 59, 70, 94], 'math': [82, 63, 41, 59, 46, 39, 58], 'english': [68, 52, 80, 86, 60, 98, 64], 'test': ['一','一','一','二','二','三','一'] }) # 使用自定義聚合方式實現 df.groupby('name').agg(sum) #聚合引數是列表 df.groupby('name').agg([sum, 'mean', np.min]) # 列表引數函式可以有多種不同寫法:直接寫函式名(容易出錯),函式名寫成字串,ndarray陣列函式 # 將聚合列索引改為自定義方式,元組實現 df.groupby('name')['chinese', 'math'].agg([('求和', sum), ('平均值', 'mean'), ('最小值', min)]) # 語文列聚合函式:求和 df.groupby('name').agg({'chinese': sum}) # 選中的多個列,每列都應用不同的多個聚合函式 df.groupby('name').agg({'chinese': [sum, 'mean'], 'math': [np.min, np.max]})
聚合引數是自定義函式
用於一些較為複雜的聚合工作
- 自定義聚合函式要比系統自帶的、經過優化的函式慢得多。
- 因為在構造中間分組資料塊時存在非常大的開銷(函式呼叫、資料重排等)
def aaa(x): return x.max() - x.min() df.groupby('name').agg(aaa) # 匿名函式實現 df.groupby('name').agg(lambda x: x.max() - x.min()) #例:返回 DataFrame 某一列中 n 個最大值 # 定一個 top 函式,返回 DataFrame 某一列中 n 個最大值 def top(df, n=2, column='chinese'): return df.sort_values(by=column, ascending=False)[:n] # 自定義函式分組聚合引數 df.groupby('name').apply(top, n=1, column='math') 總結在學習apply函式用法時候,他是可以作用dataframe.series,所以 def bbb(x): return x['chinese'].mean() >= 60 df.groupby('name').agg(bbb) # 報錯 df.groupby('name').apply(bbb) # 返回seies def bbb(x): return x.mean() >= 60 df.groupby('name').agg(bbb) # 返回datafrmae布林值 df.groupby('name').apply(bbb) # 返回dataframe布林值
過濾資料
例子:輸出所有語文考試平均分及格的資料
def bbb(x): return x.mean() >= 60 df.groupby('name').agg(bbb) # 返回布林值 df.groupby('name').filter(bbb) #輸出所有語文平均分及格的學生 df.groupby('name').filter(bbb).groupby('name').mean()
使用 transform 函式對所有的資料元素進行轉換計算
def ccc(x): return x + 10 df.groupby('name').transform(ccc)
# 使用向量化運算方式實現
df[['chinese', 'math', 'english']] + 10