Pandas-数据分组

文章目录

  • 一. 分组+聚合
    • 1. 分组聚合过程
    • 2. Pandas,Numpy内置的聚合方法
    • 3. 聚合函数
      • ① 使用Numpy库的mean函数
      • ② 自定义函数
        • Ⅰ. 一个参数
        • Ⅱ. 多个参数
      • ③ agg和 aggregate
        • Ⅰ. 传入一个函数
        • Ⅱ. 同时传入多个函数
        • Ⅲ. 向agg/aggregate中传入字典
  • 二. 分组+转换
    • 1. 使用transform分组计算z分数
    • 2. transform分组填充缺失值
    • 3. 栗子-transform
  • 三.分组+过滤
  • 四. DataFrameGroupBy对象
    • 1. DataFrameGroupBy对象
    • 2. 通过groups属性查看计算过的分组
    • 3. 在DataFrameGroupBy对象基础上,直接就可以进行aggregate,transform计算了
    • 4. 通过get_group选择分组
    • 5. 遍历分组
    • 6. 多个分组

一. 分组+聚合

在SQL中我们经常使用 GROUP BY 将某个字段,按不同的取值进行分组, 在pandas中也有groupby函数
分组之后,每组都会有至少1条数据, 将这些数据进一步处理返回单个值的过程就是聚合,比如分组之后计算算术平均值, 或者分组之后计算频数,都属于聚合

加载数据

import pandas as pd

df = pd.read_csv('data/gapminder.tsv',sep='\t')
df

在这里插入图片描述

1. 分组聚合过程

groupby语句创建若干组,对year字段分组, 会将数据中不同年份作为分组结果

df.groupby('year').lifeExp.mean()

在这里插入图片描述
查询年份

df.year.nunique()

在这里插入图片描述

years = df.year.unique()

在这里插入图片描述
上面groupby 之后取平均的结果,也可以手动计算

y1952 = df.loc[df.year == 1952, :]
y1952

在这里插入图片描述

y1952.lifeExp.mean()
49.057619718309866

groupby 语句会针对每个不同年份重复上述过程,并把所有结果放入一个DataFrame中返回
mean函数不是唯一的聚合函数, Pandas内置了许多方法, 都可以与groupby语句搭配使用

2. Pandas,Numpy内置的聚合方法

可以与groupby一起使用的方法和函数
在这里插入图片描述
上图都是可以与groupby一起使用的方法和函数
前面例子中分组之后取平均也可以使用describe函数同时计算多个统计量

df.groupby('year').lifeExp.describe()

在这里插入图片描述

3. 聚合函数

① 使用Numpy库的mean函数

import numpy as np
df.groupby('continent').lifeExp.agg('mean')
df.groupby('continent').lifeExp.agg(np.mean)
df.groupby('continent').lifeExp.aggregate('mean')
df.groupby('continent').lifeExp.aggregate(np.mean)

在这里插入图片描述
agg和 aggregate效果一样

② 自定义函数

Ⅰ. 一个参数

如果想在聚合的时候,使用非Pandas或其他库提供的计算,可以自定义函数然后在aggregate中调用它

def my_mean(values):
    #计算平均值
    #获取数据条目数
    n = len(values)
    # n1 = values.size
    # n2 = values.count()
    # print(n, n1, n2)
    sum = 0
    for value in values:
        sum += value
    return sum / n

df.groupby('year').lifeExp.agg(my_mean)

调用自定义函数 df.groupby(‘year’).lifeExp.agg(my_mean)
自定义函数中只有一个参数values,但传入该函数中的数据是一组值,需要对values进行迭代才能取出每一个值

Ⅱ. 多个参数

自定义函数可以有多个参数,第一个参数接受来自DataFrame分组这之后的值, 其余参数可自定义

def my_mean_diff(values,diff_value):
    #计算平均值和diff_value的差值

    #获取数据条目数
    n = len(values)

    sum = 0
    for value in values:
        sum += value
    mean = sum / n
    return mean - diff_value

df.groupby('year').lifeExp.agg(my_mean_diff,diff_value=50)

在这里插入图片描述

③ agg和 aggregate

Ⅰ. 传入一个函数
df.groupby('continent').lifeExp.agg('mean')
df.groupby('continent').lifeExp.aggregate('mean')

在这里插入图片描述

df.groupby('continent').agg({'lifeExp': 'mean'})

在这里插入图片描述

Ⅱ. 同时传入多个函数
df.groupby('year').lifeExp.agg(['mean','count'])
df.groupby('year').lifeExp.aggregate(['mean',np.count_nonzero])

在这里插入图片描述

不带中括号,只保留第一组

df.groupby('year').lifeExp.agg('mean','count')
df.groupby('year').lifeExp.aggregate('mean',np.count_nonzero)

在这里插入图片描述

只保留最后一组

df.groupby('year').agg({'lifeExp': 'mean', 'lifeExp': 'count'})

在这里插入图片描述

Ⅲ. 向agg/aggregate中传入字典
df.groupby('year').agg({'lifeExp':'mean','pop':'median','gdpPercap':'max'})
df.groupby('year')[['lifeExp','pop','gdpPercap']].agg('mean','median','max')

在这里插入图片描述

df.groupby('year')[['lifeExp','pop','gdpPercap']].agg({'mean','median','max'})
df.groupby('year')[['lifeExp','pop','gdpPercap']].agg(['mean','median','max'])

在这里插入图片描述

二. 分组+转换

transform 需要把DataFrame中的值传递给一个函数, 而后由该函数"转换"数据。
aggregate(聚合) 返回单个聚合值,但transform 不会减少数据量

1. 使用transform分组计算z分数

计算z-score x - 平均值/标准差

def my_zscore(x):
    return (x - x.mean()) / x.std()

df.groupby('year').lifeExp.transform(my_zscore)

在这里插入图片描述
查看数据集条目数, 跟之前transform处理之后的条目数一样

df.shape
(1704, 6)

2. transform分组填充缺失值

前介绍了填充缺失值的各种方法,对于某些数据集,可以使用列的平均值来填充缺失值。
某些情况下,可以考虑将列进行分组,分组之后取平均再填充缺失值

加载数据

tips_10 = pd.read_csv('data/tips.csv').sample(10, random_state=42)
tips_10

在这里插入图片描述

构建缺失值

tips_10.loc[np.random.permutation(tips_10.index)[:4],'total_bill'] = np.nan
tips_10

在这里插入图片描述

查看缺失值情况
count_sex = tips_10.groupby(‘sex’).count()
count_sex
在这里插入图片描述
定义函数填充缺失值

def fill_na_mean(x):
    avg = x.mean()
    return x.fillna(avg)

total_bill_group_mean = tips_10.groupby('sex').total_bill.transform(fill_na_mean)
total_bill_group_mean

在这里插入图片描述

将计算的结果赋值新列

tips_10['fill_total_bill'] = total_bill_group_mean
tips_10

在这里插入图片描述

对比total_bill 和 fill_total_bill 发现 Male 和 Female 的填充值不同

3. 栗子-transform

weight_loss数据集,找到减肥比赛赢家

  • 加载数据

    weight_loss = pd.read_csv('data/weight_loss.csv')
    weight_loss.head()
    

    在这里插入图片描述
    Bob,Amy两个人的减肥记录,从1月到4月

  • 只查看1月份数据 query 类似SQL的where条件

    weight_loss.query('Month == "Jan"')
    weight_loss[weight_loss['Month'] == 'Jan']
    

    在这里插入图片描述

  • 定义函数计算每周减肥比例 并测试

    def find_perc_loss(s):
        return (s-s.iloc[0])/s.iloc[0]
    #查找Bob 1月份的数据
    bob_jan = weight_loss.query("Name=='Bob' and Month=='Jan'")
    # bob_jan = weight_loss[weight_loss['Name'] == 'Bob' and weight_loss['Month'] == 'Jan']#报错
    Bob_jan
    

    在这里插入图片描述

    #测试计算减肥比例的方法
    find_perc_loss(bob_jan['Weight'])
    

    在这里插入图片描述

  • 计算每周减肥比例

    pcnt_loss = weight_loss.groupby(['Name','Month'])['Weight'].transform(find_perc_loss)
    pcnt_loss.head(8)
    

    在这里插入图片描述

    weight_loss['Perc Weight Loss'] = pcnt_loss.round(3)
    weight_loss
    

    查找每个月最后一周的数据 用来比较减肥效果

    week4 = weight_loss.query('Week == "Week 4"')
    week4
    

    在这里插入图片描述

  • 在第四周数据基础上,找到 Bob 和 Amy的减肥数据

    week4_Amy = week4.query('Name == "Amy"')[['Month','Perc Weight Loss']]
    week4_Amy
    

    在这里插入图片描述

    week4_Bob = week4.query('Name == "Bob"')[['Month','Perc Weight Loss']]
    week4_Bob
    

    在这里插入图片描述

  • 比较Bob 和 Amy的减肥效果, Amy的减肥效果更明显

    week4_Bob.set_index('Month')-week4_Amy.set_index('Month')
    

    在这里插入图片描述

三.分组+过滤

使用groupby方法还可以过滤数据
调用filter 方法,传入一个返回布尔值的函数,返回False的数据会被过滤掉

使用小费数据

tips = pd.read_csv('data/tips.csv')
tips.head()

在这里插入图片描述

查看用餐人数

tips['size'].value_counts()

在这里插入图片描述

人数为1、5和6人的数据比较少,考虑将这部分数据过滤掉

tips_filtered= tips.groupby('size').filter(lambda x:x['size'].count()>30)
tips_filtered

在这里插入图片描述

查看结果

tips_filtered['size'].value_counts()

在这里插入图片描述

四. DataFrameGroupBy对象

1. DataFrameGroupBy对象

准备数据

tips_10 = pd.read_csv('data/tips.csv').sample(10,random_state = 42)
tips_10

在这里插入图片描述

调用groupby 创建分组对象

grouped = tips_10.groupby('sex')

查看grouped

grouped

grouped是一个DataFrameGroupBy对象
在这里插入图片描述

2. 通过groups属性查看计算过的分组

grouped.groups

在这里插入图片描述
上面返回的结果是DataFrame的索引,实际上就是原始数据的行数

3. 在DataFrameGroupBy对象基础上,直接就可以进行aggregate,transform计算了

grouped.mean()

在这里插入图片描述
上面结果直接计算了按sex分组后,所有列的平均值,但只返回了数值列的结果,非数值列不会计算平均值

4. 通过get_group选择分组

female = grouped.get_group('Female')
female

在这里插入图片描述

5. 遍历分组

通过groupby对象,可以遍历所有分组
相比于在groupby之后使用aggregate、transform和filter,有时候使用for循环解决问题更简单

for sex_group in grouped:
    print(sex_group)

在这里插入图片描述

DataFrameGroupBy对象直接传入索引,会报错 grouped[0]

for sex_group in grouped:
    #遍历grouped对象,查看sex_group数据类型
    print(type(sex_group))
    #查看元素个数
    print(len(sex_group))
    #查看第一个元素
    print(sex_group[0])
    break

在这里插入图片描述

6. 多个分组

前面使用的groupby语句只包含一个变量,可以在groupby中添加多个变量

使用groupby按性别和用餐时间分别计算小费数据的平均值

group_avg = tips_10.groupby(['sex','time']).mean()

在这里插入图片描述

分别查看分组之后结果的列名和行索引

group_avg.columns

在这里插入图片描述

group_avg.index

在这里插入图片描述
多个分组之后返回的是MultiIndex

在结果上调用reset_index方法得到一个普通的DataFrame

group_avg.reset_index()

也可以在分组的时候通过as_index = False参数(默认是True),效果与调用reset_index()一样

tips_10.groupby(['sex','time'],as_index = False).mean()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上,编译运行WordCount程序。完成实验操作后,读者会掌握简单的程序编写,如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统;安装mpich-3…

【paddle】初次尝试

张量 张量是 paddlepaddle, torch, tensorflow 等 python 主流机器学习包中唯一通货变量,因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

Frontend - 分页(针对 python / Django )

目录 一、同个文件内(方式一) 1. 前端 html 2. 定义分页界面 3. 获取分页数据 4.后端根据前端分页需求,整理分页数据 5.显示情况 6. JsonResponse 相关知识 二、不同文件内依旧有效(方式二,更优化)…

骑行解压:身心的奇妙之旅,VELO Angel Revo坐垫

在快节奏的都市生活中,骑行不仅是一种健康的生活方式,更是一种心灵的释放。从心理生理学的角度来看,骑行能够促使身体分泌内啡肽,带来愉悦感,同时,它还能转移注意力,缓解焦虑。在这场身心的奇妙…

HarmonyOS NEXT 实战之元服务:静态案例效果---教育培训服务

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞FilesystemObject) 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件,从而实现进一步的…

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人,所幸终会天亮。明天就是新的开始,我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen,这是一个 Rust 库和 CLI…

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片 数据集分割 训练组80% 1967图片 有效集13% 317图片 测试集7% 161图片 预处…

C 语言:注释的重要性及用法详解

目录 一、注释的作用 二、C 语言中的注释类型 三、注释的实践 四、注释的注意事项 五、总结 在 C 语言编程中,注释是一种非常重要的工具,它可以帮助程序员更好地理解代码、提高代码的可读性和可维护性。本文将详细介绍 C 语言中注释的用法和重要性。…

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日,2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者,共同探讨云计算产业发展方向和未来机遇,展示云计算标准化工作重要成果。 会上,云建设与应用领航计划(2024)建云用…

LeetCode - 初级算法 数组(存在重复元素)

存在重复元素 这篇文章讨论如何判断一个数组中是否存在重复元素。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,如果任一值在数组中出现至少两次,返回 true;如果数组中每个元素互不相同,返回 false。 示例: 输入: nums =…

C++笔记之尾后迭代器

C笔记之尾后迭代器 code review! 参考笔记 1.C笔记之尾后迭代器 2.C笔记之迭代器失效问题处理 在C中,尾后迭代器(通常称为 past-the-end iterator)是指指向容器中最后一个元素之后的位置的迭代器。它并不指向任何有效的元素,而是…

Gibbs现象(Gibbs Phenomenon)最初数学上的定义

Gibbs现象(Gibbs Phenomenon)是在处理周期性信号的傅里叶级数展开时出现的一种现象。当一个周期函数在不连续点附近被其傅里叶级数的部分和近似时,近似值会在不连续点处产生过冲(overshoot)和欠冲(undersho…

【时时三省】(C语言基础)动态内存函数realloc

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 realloc realloc函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,…

pycharm+anaconda创建项目

pycharmanaconda创建项目 安装: Windows下PythonPyCharm的安装步骤及PyCharm的使用-CSDN博客 详细Anaconda安装配置环境创建教程-CSDN博客 创建项目: 开始尝试新建一个项目吧! 选择好项目建设的文件夹 我的项目命名为:pyth…

ActiveMQ支持哪些传输协议

ActiveMQ 支持多种传输协议,以满足不同场景下的需求。这些协议包括但不限于以下几种: 1. OpenWire: • 这是 ActiveMQ 的默认和专有协议。 • 提供了高效、可靠的消息传递功能。 • 支持多种消息传递模式,如点对点和发布/订阅。 2…

Spring SpEL表达式由浅入深

标题 前言概述功能使用字面值对象属性和方法变量引用#this 和 #root变量获取类的类型调用对象(类)的方法调用类构造器类型转换运算符赋值运算符条件(关系)表达式三元表达式Elvis 操作符逻辑运算instanceof 和 正则表达式的匹配操作符 安全导航操作员数组集合(Array 、List、Map…