5.分组聚合
首先来创建数据:
import numpy as np import pandas as pd # 准备数据 df = pd.DataFrame(data = {'sex':np.random.randint(0, 2, size = 300), # 0男,1女 'class':np.random.randint(1, 9, size = 300),# 1~8八个班 'Python':np.random.randint(0, 151, size = 300),# Python成绩 'Keras':np.random.randint(0, 151, size =300),# Keras成绩 'Tensorflow':np.random.randint(0, 151, size = 300), 'Java':np.random.randint(0, 151,size = 300), 'C++':np.random.randint(0, 151, size = 300)}) df['sex'] = df['sex'].map({0:'男', 1:'女'}) # 将0,1映射成男女 df
5.1 分组
🚩根据性别分组并求出平均值,并把平均值保留一位小数:
df.groupby(by = 'sex').mean().round(1)
分组统计男女的数量:
df.groupby(by = 'sex').size()
根据性别和班级两个属性进行分组:
df.groupby(by = ['sex', 'class']).size()
获取每个班,男生女生Python,Java最高分
df.groupby(by = ['sex', 'class'])[['Python', 'Java']].max()
我们通过多层索引的思想对上述代码稍作调整:
df.groupby(by = ['class', 'sex'])[['Python', 'Java']].max()
再用之前学过的数据重塑,又可以稍加变形:
df.groupby(by = ['class', 'sex'])[['Python', 'Java']].max().unstack()
5.2 分组聚合apply、transform
🚩apply
返回的是汇总后的情况,对于每一个分组大类都只返回一个结果:
df.groupby(by = ['class','sex'])[['Python','Keras']].apply(np.mean).round(1)
transform是把所有的元素全部返回:
df.groupby(by = ['class','sex'])[['Python','Keras']].transform(np.mean).round(1)
5.3 分组聚合agg
🚩agg 比起 apply 和 transform 来说,功能更加的强大
# 按照班级和性别进行划分,统计 Tensorflow 和 Keras 这两门学科的最大值,最小值,个数 df.groupby(by = ['class','sex'])[['Tensorflow','Keras']].agg( [np.max, np.min, pd.Series.count])
# 分组后不同属性应用多种不同统计汇总 # 对 Python 计算最大值和最小值 # 对 Keras 计数和计算中位数 df.groupby(by = ['class','sex'])[['Python','Keras']].agg( {'Python':[('最大值',np.max),('最小值',np.min)], 'Keras':[('计数',pd.Series.count),('中位数',np.median)]})
5.4 透视表pivot_table
🚩所谓透视,其实就是发现事物的一定规律
def count(x): return len(x) df.pivot_table(values=['Python', 'Keras', 'Tensorflow'],# 要透视分组的值 index=['class', 'sex'], # 分组透视指标,相当于之前的 by aggfunc={'Python':[('最大值', np.max)], # 聚合运算 'Keras':[('最小值', np.min),('中位数', np.median)], 'Tensorflow':[('最小值', np.min),('平均值', np.mean),('计数', count)]})
6.数据可视化
🚩修本章节之前需要安装matplotlib,建议先修:matplotlib的安装教程以及简单调用
6.1 线形图
df1 = pd.DataFrame(data = np.random.randn(1000, 4), index = pd.date_range(start = '23/1/2022', periods = 1000), columns=list('ABCD')) df1.cumsum().plot()
6.2 条形图
df2 = pd.DataFrame(data = np.random.rand(10, 4), columns = list('ABCD')) display(df2.plot.bar(stacked = True)) # stacked 堆叠 display(df2.plot.bar(stacked = False))# stacked 不堆叠
6.3 饼图
# 饼图用来表示百分比,百分比是自动计算的,颜色可以更换 df3 = pd.DataFrame(data = np.random.rand(4, 2), index = list('ABCD'), columns = ['One', 'Two']) # subplots 表示两个图,多个图 # figsize 表示尺寸 df3.plot.pie(subplots = True,figsize = (8, 8))
更换颜色:
# 更换颜色 df3 = pd.DataFrame(data = np.random.rand(4, 2), index = list('ABCD'), columns = ['One', 'Two']) df3.plot.pie(subplots = True,figsize = (8, 8), colors = np.random.random(size = (4, 3)))
6.4 散点图
# 横纵坐标,表示两个属性之间的关系 df4 = pd.DataFrame(np.random.randint(0, 50, size = (50, 4)), columns = list('ABCD')) display(df4.plot.scatter(x = 'A', y = 'B')) # A和B关系绘制 df4['F'] = df4['C'].map(lambda x : x + np.random.randint(-5, 5, size = 1)[0]) display(df4.plot.scatter(x = 'C', y = 'F'))
6.5 面积图
df5 = pd.DataFrame(data = np.random.rand(10, 4), columns = list('ABCD')) display(df5.plot.area(stacked = True)) # stacked 堆叠 display(df5.plot.area(stacked = False)) # stacked 不堆叠
同样,我们可以调节它的颜色:
df5 = pd.DataFrame(data = np.random.rand(10, 4), columns = list('ABCD')) display(df5.plot.area(stacked = True, color = np.random.rand(4, 3))) # 解释一下 random.rand(4, 3) # 3就代表三个颜色:红绿蓝(三基色) # 4就代表 ABCD