You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.5 KiB

3.2.5:分组聚合

分组

通常我们将数据分成多个集合的操作称之为分组,Pandas中使用groupby()函数来实现分组操作。

单列和多列分组

对分组后的子集进行数值运算时,不是数值的列会自动过滤

import pandas as pd
data = {'A': [1, 2, 2, 3, 2, 4],
        'B': [2014, 2015, 2014, 2014, 2015, 2017],
        'C': ["a", "b", "c", "d", "e", "f"],
        'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
        }
df = pd.DataFrame(data)
df.groupby("B")   #单列分组  返回的是一个groupby对象
df.groupby(["B","C"])    #多列分组

Series系列分组

选取数据帧中的一列作为index进行分组:

df["A"].groupby(df["B"])   #df的 A 列根据 B 进行分组

通过数据类型或者字典分组

数据类型分组:

df.groupby(df.dtypes,axis=1)   # axis=1表示按列分组以数据类型为列名

传入字典分组:

dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
df.groupby(dic, axis=1)   #按列分组,列名是字典的值

获取单个分组

使用get_group()方法可以选择一个组。

df.groupby("A").get_group(2)

输出:

   A     B  C    D
1  2  2015  b  0.9
2  2  2014  c  2.1
4  2  2015  e  0.5

对分组进行迭代

GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)。

for name,data in df.groupby("A"):
        print(name)
        print(data)

输出:

1
   A     B  C    D
0  1  2014  a  0.5
2
   A     B  C    D
1  2  2015  b  0.9
2  2  2014  c  2.1
4  2  2015  e  0.5
3
   A     B  C    D
3  3  2014  d  1.5
4
   A     B  C    D
5  4  2017  f  0.1

聚合

聚合函数为每个组返回单个聚合值。当创建了groupby对象,就可以对分组数据执行多个聚合操作。比较常用的是通过聚合函数或等效的agg方法聚合。常用的聚合函数如下表:

函数名 说明
count 分组中非空值的数量
sum 非空值的和
mean 非空值的平均值
median 非空值的中位数
std、var 无偏标准差和方差
min、max 非空值的最小和最大值
prod 非空值的积
first、last 第一个和最后一个非空值

应用单个聚合函数

对分组后的子集进行数值运算时,不是数值的列会自动过滤

import pandas as pd
import numpy as np
data = {'A': [1, 2, 2, 3, 2, 4],
        'B': [2014, 2015, 2014, 2014, 2015, 2017],
        'C': ["a", "b", "c", "d", "e", "f"],
        'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
        }
df = pd.DataFrame(data)
df.groupby("B").sum()       #对分组进行求和

输出:

		A	D
B		
2014	6	4.1
2015	4	1.4
2017	4	0.1
df.groupby("B").describe()

输出:

应用多个聚合函数

df.groupby("B").agg([np.sum,np.mean,np.std])

输出:

	  A	                D
	  sum	mean   std	sum	 mean	    std
B						
2014	6	 2	 1.0	4.1	1.366667	0.808290
2015	4	 2	 0.0	1.4	0.700000	0.282843
2017	4	 4	 NaN	0.1	0.100000	NaN

自定义函数传入agg()中

def result(df):
    return df.max() - df.min()
df.groupby("B").agg(result)  #求每一组最大值与最小值的差

输出:

		A	D
B		
2014	2	1.6
2015	0	0.4
2017	0	0.0

对不同的列使用不同的聚合函数

mapping = {"A":np.sum,"D":np.mean}
df.groupby("B").agg(mapping)

输出:

		A	D
B		
2014	6	1.366667
2015	4	0.700000
2017	4	0.100000