educoder实训作业:
分组聚合:
分组聚合的流程主要有三步:
- 分割步骤将
DataFrame
按照指定的键分割成若干组; - 应用步骤对每个组应用函数,通常是累计、转换或过滤函数;
- 组合步骤将每一组的结果合并成一个输出数组。
分组
通常我们将数据分成多个集合的操作称之为分组,Pandas
中使用groupby()
函数来实现分组操作。
单列和多列分组
对分组后的子集进行数值运算时,不是数值的列会自动过滤;
1 import pandas as pd
2 data = {'A': [1, 2, 2, 3, 2, 4],
3 'B': [2014, 2015, 2014, 2014, 2015, 2017],
4 'C': ["a", "b", "c", "d", "e", "f"],
5 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
6 }
7 df = pd.DataFrame(data)
8 df.groupby("B") #单列分组 返回的是一个groupby对象
9 df.groupby(["B","C"])#多列分组
Series系列分组
选取数据帧中的一列作为index
进行分组:
1 df["A"].groupby(df["B"]) #df的 A 列根据 B 进行分组
通过数据类型或者字典分组
数据类型分组:
1 df.groupby(df.dtypes,axis=1) # axis=1表示按列分组,以数据类型为列名
传入字典分组:
1 dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
2 df.groupby(dic, axis=1) #按列分组,列名是字典的值
获取单个分组
使用get_group()
方法可以选择一个组:
1 df.groupby("A").get_group(2)
可获得分组详情:
对分组进行迭代
GroupBy
对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)。
1 for name,data in df.groupby("A"):
2 print(name)
3 print(data)
可实现:
将是同一个名字的分为一组
1 1
2 A B C D
3 0 1 2014 a 0.5
4 2
5 A B C D
6 1 2 2015 b 0.9
7 2 2 2014 c 2.1
8 4 2 2015 e 0.5
9 3
10 A B C D
11 3 3 2014 d 1.5
12 4
13 A B C D
14 5 4 2017 f 0.1
聚合
聚合函数为每个组返回单个聚合值。当创建了groupby
对象,就可以对分组数据执行多个聚合操作。比较常用的是通过聚合函数或等效的agg
方法聚合。常用的聚合函数如下表:
函数名 | 说明 |
count | 分组中非空值的数量 |
sum | 非空值的和 |
mean | 非空值的平均值 |
median | 非空值的中位数 |
std、var | 无偏标准差和方差 |
min、max | 非空值的最小和最大值 |
prod | 非空值的积 |
first、last | 第一个和最后一个非空值 |
应用单个聚合函数
对分组后的子集进行数值运算时,不是数值的列会自动过滤;
1 import pandas as pd
2 import numpy as np
3 data = {'A': [1, 2, 2, 3, 2, 4],
4 'B': [2014, 2015, 2014, 2014, 2015, 2017],
5 'C': ["a", "b", "c", "d", "e", "f"],
6 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
7 }
8 df = pd.DataFrame(data)
9 df.groupby("B").sum() #对分组进行求和
应用多个聚合函数:
1 df.groupby("B").agg([np.sum,np.mean,np.std])
自定义函数传入agg()中
#自定义函数,对组间进行自定义运算。
1 def result(df):
2 return df.max() - df.min()
3 df.groupby("B").agg(result) #求每一组最大值与最小值的差
对不同的列使用不同的聚合函数
1 mapping = {"A":np.sum,"B":np.mean}
2 df.groupby("C").agg(mapping)
例题:
使用Pandas
加载drinks.csv
文件中的数据,根据数据信息求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。
可实现代码:
1 import pandas as pd
2 import numpy as np
3
4 #返回最大值与最小值的差
5 def sub(df):
6 ######## Begin #######
7 #求最大值与最小值之差
8 return df.max() - df.min()
9 ######## End #######
10
11 def main():
12 ######## Begin #######
13 data = pd.read_csv("step1/drinks.csv")#将表格资源读入
14 #创建可视化模型
15 df = pd.DataFrame(data)
16 #对数据进行分组聚合
17 mapping = {"wine_servings":sub,"beer_servings":np.sum}
18 #打印信息
19 print(df.groupby("continent").agg(mapping))
20 ######## End #######
21
22 if __name__ == '__main__':
23 main()
运行结果:
本次博客内容出自educoder作业实训项目,实训题材出自专业人士,他们对pandas进阶类项目有着非常成熟且敏锐的洞察力,这让练习并学习着的我们有了非常之大的收获,希望通过自己的又一遍回顾学习能对之有更深远的理解,同时以此分享给大家,能和大家一同进步成长。