Python知识分享第三十五天-Pandas分组聚合
Pandas分组聚合
演示分组对象
import pandas as pd
import os
os.chdir(r'D:\code\ai_22_work\My_Numpy\day04')
# 演示分组对象
# 准备动作 读取数据 获取df对象
df = pd.read_csv('./data/uniqlo.csv')
# 基于一列进行分组 获取DataFrameGroupBy 分组对象
# 需求基于顾客的性别分组
df.groupby('gender_group')
df.groupby('gender_group')['city']
# 用变量接收 分组对象 获取某个分组的信息
df_gb = df.groupby('gender_group')
# print(df_gb.get_group('Female'))
# 基于多列进行分组 获得DataFrameGroupBy
# 需求 基于顾客的性别和城市 分组
df.groupby(['gender_group','city'])
# 分组后 获取到每个分组的第一条或者 最后一条数据
# first()
# last()
# df.groupby('gender_group').first()
df.groupby('gender_group').last()
# 变量记录 分组对象
df_gb = df.groupby(['gender_group', 'city'])
df_gb.first()
df_gb.last()
演示分组聚合操作
# 演示分组聚合操作
# 格式
# df.groupby(['分组字段1','分组字段2']).agg({'列名':'聚合函数名','列名2':'聚合函数名'....})
# df.pivot_table(index='行索引',columns='列',values='值',aggfunc='聚合函数名')
# 需求一 按照城市分组 计算每个城市的客户数量
# 方式一 groupby() + 聚合函数
df.groupby('city').customer.sum()
df.groupby('city').customer.agg('sum')
df.groupby('city').agg({'customer':'sum'})
# 方式二 pivot_table
df.pivot_table(index='city', values='customer', aggfunc='sum')
# 需求二 按照城市 性别 分组 计算每个城市的客户数量
# 方式一 groupby+聚合函数
df.groupby(['city','gender_group']).customer.sum()
df.groupby(['city','gender_group']).customer.agg('sum')
df.groupby(['city','gender_group']).agg({'customer':'sum'})
# 方式二
df.pivot_table(index=['city','gender_group'],values='customer',aggfunc='sum')
# 变形写法 类似于 行列转置 更直观的查看 分组聚合结果
# index表示行 columns表示 列 values 表示值 aggfunc表示聚合函数
df.pivot_table(index='city', columns='gender_group',values='customer',aggfunc='sum')
# 需求3 按照城市 销售渠道划分 分别计算 销售金额的平均值 成本的综合
# 方式一 groupby()+ 聚合函数
df.groupby(['city','channel']).agg({'revenue':'mean','unit_cost':'sum'})
# 方式二 pivot_table() 透视表
df.pivot_table(index=['city','channel'],values=['revenue','unit_cost'],aggfunc={'revenue':'mean','unit_cost':'sum'})
# 透视表的几种变形写法
# 变形1 因为没有指定哪个列 mean(平均值) 哪个列 sum(总和),所以默认 所有列都进行平均和总和的运算
df.pivot_table(index=['city','channel'],values=['revenue','unit_cost'],aggfunc=['mean','sum'])
df.pivot_table(index=['city','channel'],values=['revenue','unit_cost'],aggfunc=['mean','sum']).iloc[:,[0,3]] # 只显示所需要的列
# 变形二 透视表 行列转置 columns; 分组字段的值 作为列名 values 聚合函数的结果作为值
df.pivot_table(idnex='city', columns='channel',values=['revenue','unit_cost'],aggfunc={'revenue':'mean','unit_cost':'sum'})
# df.groupby(['city','gender_group']).customer.sum()
分组过滤
# 分组过滤
# 需求 按照城市分组 查询每组销售金额平均值
# df.groupby('city').revenue.mean()
# df.groupby('city').revenue.agg('mean')
df.groupby('city').agg({'revenue':'mean'})
# filter() 函数 分组过滤
df.groupby('city').get_group('上海') # 根据分组名, 获取该分组的数据.
df.groupby('city').get_group('深圳') # 根据分组名, 获取该分组的数据.
df.groupby('city').get_group('广州') # 根据分组名, 获取该分组的数据.
df.groupby('city').get_group('北京') # 根据分组名, 获取该分组的数据.
# 解释需求 就是 按照城市分组 计算每组的销售金额的平均值 并筛选出大于200的所有分组的数据
# filter() 根据条件 筛选出合法的数据'
# df.groupby('city').filter(lambda s:s['revenue'].mean() > 200)
df.groupby('city')['revenue'].filter(lambda s:s.mean() > 200)
坚持分享 共同进步 如有错误 欢迎指出