python pandas分組聚合
1、環境
- python3.9
- win10 64bit
- pandas==1.2.1
groupby
方法是pandas中的分組方法,對數據框采用groupby
方法后,返回的是DataFrameGroupBy
對象,一般分組操作后會進行聚合操作。
2、分組
1
2
3
4
5
6
|
import pandas as pd import numpy as np pd.set_option( 'display.notebook_repr_html' , False ) # 數據準備 df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 1 , 2 , 3 , 4 ], 'C' :[ 6 , 8 , 1 , 9 ]}) df |
1
2
3
4
5
|
A B C 0 1 1 6 1 1 2 8 2 2 3 1 3 2 4 9 |
對數據框按A
列進行分組,產生分組數據框。分組數據框是可迭代對象,可以進行循環遍歷,可以看出在循環中,每個元素的類型是元組,
元組的第一個元素是分組值,第二個元素是對應的分組數據框。
1
2
3
4
|
# 分組 g_df = df.groupby( 'A' ) # 分組數據框類 type (g_df) |
1
|
pandas.core.groupby.generic.DataFrameGroupBy |
1
2
3
|
# 循環分組數據 for i in g_df: print (i, type (i),end = '\n\n' ) |
1
2
3
|
( 1 , A B C 0 1 1 6 1 1 2 8 ) < class 'tuple' > |
1
2
3
|
( 2 , A B C 2 2 3 1 3 2 4 9 ) < class 'tuple' > |
可以對分組后的數據框直接使用聚合方法agg
,對分組數據框的每一列計算統計函數值。
1
2
3
4
5
6
|
# 分組求和 df.groupby( 'A' ).agg( 'sum' ) B C A 1 3 14 2 7 10 |
3、序列分組
可以根據數據框外的序列數據對數據框進行分組,需要注意序列長度需要與數據框行數相同。
1
2
3
4
5
6
7
|
# 定義分組列表 label = [ 'a' , 'a' , 'b' , 'b' ] # 分組求和 df.groupby(label).agg( 'sum' ) A B C a 2 3 14 b 4 7 10 |
4、多列分組
可以根據數據框的多列對數據框進行分組。
1
2
3
|
# 數據準備 df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ]}) df |
1
2
3
4
5
|
A B C 0 1 3 6 1 1 4 8 2 2 3 1 3 2 3 9 |
根據A
,B
列進行分組,然后求和。
1
2
|
# 根據多列分組求和 df.groupby([ 'A' , 'B' ]).agg( 'sum' ) |
1
2
3
4
5
|
C A B 1 3 6 4 8 2 3 10 |
5、索引分組
可以根據索引對數據框進行分組,需要設置level參數。
1
2
3
|
# 數據準備 df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ]},index = [ 'a' , 'a' , 'b' , 'b' ]) df |
1
2
3
4
5
|
A B C a 1 3 6 a 1 4 8 b 2 3 1 b 2 3 9 |
數據框只有一層索引,設置參數level=0
。
1
2
3
4
5
|
# 根據索引分組求和 df.groupby(level = 0 ).agg( 'sum' ) A B C a 2 7 14 b 4 6 10 |
當數據框索引有多層時,也可以根據需求設置level參數,完成分組聚合。
1
2
3
4
|
# 數據準備 mi = pd.MultiIndex.from_arrays([[ 1 , 1 , 2 , 2 ],[ 3 , 4 , 3 , 3 ]],names = [ 'id1' , 'id2' ]) df = pd.DataFrame( dict (value = [ 4 , 7 , 2 , 9 ]),index = mi) df |
1
2
3
4
5
6
|
value id1 id2 1 3 4 4 7 2 3 2 3 9 |
設置level
參數,如需要根據第一層索引,即id1進行分組,可以設置level=0
或level='id1'
完成分組聚合。
1
2
|
# 根據第一層索引分組求和 df.groupby(level = 0 ).agg( 'sum' ) |
1
2
3
4
|
value id1 1 11 2 11 |
1
2
3
|
# 根據第一層索引分組求和 df.groupby(level = 'id1' ).agg( 'sum' ) |
1
2
3
4
|
value id1 1 11 2 11 |
7、聚合
分組后一般會進行聚合操作,用agg
方法進行聚合。
1
2
3
|
# 數據準備 df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ], 'D' :[ 2 , 5 , 4 , 8 ]}) df |
1
2
3
4
5
|
A B C D 0 1 3 6 2 1 1 4 8 5 2 2 3 1 4 3 2 3 9 8 |
8、單函數對多列
對分組后數據框使用單個函數進行聚合,單個聚合函數會對每列進行計算,然后合并返回。聚合函數以字符串的形式傳入。
1
2
|
# 對所有列分組求和 df.groupby( 'A' ).agg( 'sum' ) |
1
2
3
4
|
B C D A 1 7 14 7 2 6 10 12 |
可以對分組后的數據指定列進行分組聚合。需要注意子列需要用[]包裹
。
1
2
|
# 對指定列分組求和 df.groupby( 'A' )[[ 'B' , 'C' ]].agg( 'sum' ) |
1
2
3
4
|
B C A 1 7 14 2 6 10 |
聚合函數也可以傳入自定義的匿名函數。
1
2
|
# 匿名函數分組求和 df.groupby( 'A' ).agg( lambda x: sum (x)) |
1
2
3
4
|
B C D A 1 7 14 7 2 6 10 12 |
9、多函數對多列
聚合函數可以是多個函數。聚合時,多個聚合函數會對每列進行計算,然后合并返回。聚合函數以列表的形式傳入。
1
2
|
# 全部列多函數聚合 df.groupby( 'A' ).agg([ 'sum' , 'mean' ]) |
1
2
3
4
5
|
B C D sum mean sum mean sum mean A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0 |
聚合返回后的數據列名有兩層索引,第一層是聚合的列名,第二層是使用的聚合函數名。如果需要對返回的聚合函數名重命名,
需要在傳參時,傳入元組,第一個元素為聚合函數名,第二個元素為聚合函數。
1
2
|
# 聚合函數重命名 df.groupby( 'A' ).agg([( 'SUM' , 'sum' ),( 'MEAN' , 'mean' )]) |
1
2
3
4
5
|
B C D SUM MEAN SUM MEAN SUM MEAN A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0 |
同樣,也可以傳入匿名函數。
1
2
|
# 匿名函數并重命名 df.groupby( 'A' ).agg([( 'SUM' , 'sum' ),( 'MAX' , lambda x: max (x))]) |
1
2
3
4
5
|
B C D SUM MAX SUM MAX SUM MAX A 1 7 4 14 8 7 5 2 6 3 10 9 12 8 |
如果需要對不同的列進行不同的聚合計算,則需要傳入字典的形式。
1
2
|
# 不同列不同聚合函數 df.groupby( 'A' ).agg({ 'B' :[ 'sum' , 'mean' ], 'C' : 'mean' }) |
1
2
3
4
5
|
B C sum mean mean A 1 7 3.5 7 2 6 3.0 5 |
可以重命名聚合后的列名,注意只能對一列傳入一個聚合函數時有效
。
1
2
|
# 聚合后重命名列名 df.groupby( 'A' ).agg(B_sum = ( 'B' , 'sum' ),C_mean = ( 'C' , 'mean' )) |
1
2
3
4
|
B_sum C_mean A 1 7 7 2 6 5 |
到此這篇關于python pandas分組聚合詳細的文章就介紹到這了,更多相關python pandas分組聚合內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.jianshu.com/p/bd8d6ba29d0e