当前位置: 首页 > article >正文

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)

坚持分享 共同进步 如有错误 欢迎指出


http://www.kler.cn/a/451308.html

相关文章:

  • 前端工作中问题点拆分
  • Doris Tablet 损坏如何应对?能恢复数据吗?
  • 重温设计模式--享元模式
  • 如何根据一系列提交文件,匹配对应的git提交记录?用ai
  • 亚远景-SO 21434标准下的汽车网络安全:风险评估与管理的关键实践
  • Spring Security 6 系列之七 - 自定义异常管理
  • Linux 静默安装weblogic及JDK安装
  • chrome主页被被篡改的修复方法
  • 安全见闻(2)
  • 命令手动更新 Navigator
  • C 数组:索引魔杖点化的数据星图阵列
  • Grafana服务监控与日志查询可视化
  • 【C++】B2066救援题目分析和解决讲解
  • 随手记录第十四话 -- 在 Spring Boot 3.2.3 中使用 springdoc-openapi-starter-webmvc-ui
  • 解决Ubuntu下无法装载 Windows D盘的问题
  • 爬虫学习案例8
  • 【开源】一款基于SpringBoot的智慧小区物业管理系统
  • 华为堆叠的多主检测
  • Python数据分析可视化之词云图
  • 架构师应如何考虑重构
  • ArcGIS Maps SDK for JavaScript:根据经纬度定位,并添加定位标记
  • Git开发常用命令总结
  • 关于卡尔曼滤波
  • Mono里运行C#脚本3—mono_jit_init
  • Leetcode855:考场就座
  • 聚类之轮廓系数