Pandas分组与分箱

server/2024/10/25 2:21:41/

目录

分组

df.groupby分组函数返回分组对象

去除每组第一条或最后一条数据

获取分组后的每组名称

get_group()按组依据获取其中一组

分组聚合

分组后直接聚合

分组后指定单列或多列聚合

分组后使用多个聚合函数

分组后对多列分别使用不同的聚合函数

分组后使用自定义聚合函数

 分箱(数据离散化)


分组

df.groupby分组函数返回分组对象

准备数据

import pandas as pd# 1.1  df.groupby分组函数返回分组对象
df = pd.read_csv('../data/b_LJdata.csv')
df2 = df.head(20).copy()
df2

1) 基于一列进行分组

gs = df2.groupby(by="区域") # DataFrameGroupBy
print(gs)
print(gs['价格'])

2)  基于多列进行分组

gs = df2.groupby(by=["区域", "户型"])
print(gs)

3)  返回的分组对象可以直接使用,或选择一列做聚合、转换、过滤操作;比如要计算不同区域、不同户型的平均租金

df2.groupby(by=["区域", "户型"])['价格'].mean()

去除每组第一条或最后一条数据

# 分组
gs2 = df2.groupby(by="户型")# 取出每组第一条数据
gs2.first()# 取出每组最后一条数据
gs2.last()

获取分组后的每组名称

1)  基于一列分组

# 1.3 获取分组后每组的名称
gs2 = df2.groupby(by="户型")
gs2.grouper.result_index

2)  基于多列分组

gs3 = df2.groupby(by = ["区域","户型"])
print(gs3.grouper.result_index)

get_group()按组依据获取其中一组

gs2.get_group(name='3室1厅')

分组聚合

分组后直接聚合

分组后直接进行聚合计算并返回df
df.groupby(by=[列名1, 列名2, ...]).聚合函数()
# 求 根据 户型 分组, 求平均值
result = df2.groupby(by='户型').mean()
result

分组后指定单列或多列聚合

根据1列或多列的值进行分组后, 每一组都对指定列的值使用聚合函数(比如mean求平均值)进行计算

对一列聚合可以使用一个[], 返回series对象; 也可以使用两个[], 返回dataframe对象

对多列聚合建议使用两个[[]], 返回dataframe对象

df.groupby(['列名1', '列名2'])['指定列1'].聚合函数() df.groupby(['列名1', '列名2'])[['指定列1', '指定列2', ...]].聚合函数()

1) 按户型分组,计算每组价格的平均值

# 求 根据 户型 分组, 求 面积的 平均值
result = df2.groupby(by='户型')["面积"].mean()
print(type(result))
print('================================')
result1 = df2.groupby(by='户型')[["面积"]].mean()
print(type(result1))
result1

2)  按户型分组,计算每组价格和看房人数的平均值

# 求 根据 户型 分组, 求 面积和价格 的平均值
result = df2.groupby(by='户型')[["面积", "价格"]].mean()
result

分组后使用多个聚合函数

同时使用多个内置聚合函数,全部放入一个Python列表, 然后把整个列表传入agg或aggregate函数中;返回以分组列作为索引,每一个聚合计算结果作为列的全新df

df.groupby(['列名1', '列名2'])[['指定列1', '指定列2']].agg(['max', 'min'])

max, min 为pandas内置的聚合函数名

1) 根据 户型 分组, 求 面积和价格 的平均值和求和

# 求 根据 户型 分组, 求 面积和价格 的平均值和求和
result = df2.groupby(by='户型')[["面积", "价格"]].agg(['mean', 'sum'])
result

2)  根据 户型 分组, 求 面积和看房人数 的平均值和求和

result = df2.groupby(by='户型')[["价格", "看房人数"]].agg(['mean', 'sum'])
result

分组后对多列分别使用不同的聚合函数

agg函数中可以传入字典,字典的key是df的列名,与key对应的value是pandas内置的聚合计算函数、其名称的字符串;返回以分组列作为索引,每一个聚合计算结果作为列的全新df

df.groupby(['列名1', '列名2']).agg({ '指定列1':'mean', '指定列2':'sum', '指定列3':'mean' })

1 )  按户型分组, 计算每组价格的平均值和看房人数的总数

result = df2.groupby(by='户型').agg({"价格":"mean", "看房人数":"sum"})
result

2)  按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数

# 按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数
result = df2.groupby(by='户型').agg({"价格":["mean", "sum"], "看房人数":"sum"})
result

 

分组后使用自定义聚合函数

1) 自定义函数

# 按户型分组, 计算每组价格和看房人数的平均值
def fn(x):s_mean = x.sum() / x.sizereturn s_meanresult = df2.groupby(['户型'])[["价格", "看房人数"]].agg(fn)
result

2) lambda  函数

result = df2.groupby(['户型'])[["价格", "看房人数"]].agg(lambda x: x.sum() / x.size)
result

 分箱(数据离散化)

  • pd.cut()函数用来把一组数据分割成离散的区间。比如有一组年龄数据,可以使用pandas.cut将价格数据分割成不同的价格段并打上标签。上述过程又叫做分箱。

1) 自定义分箱个数 

# 分箱
df3 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df3['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df3

  • 离散化分箱函数的常用参数有:

    • x 指定离散化(分箱)依据的列,Seriers对象

    • bins 分为几组,int类型,也可以传入分组区间的列表

    • labels 每组的标签名称,按数值由小到大的顺序

    • right 默认True:左开右闭;False:左闭右开

    • include_lowest 默认False:不包含第一个分组的起始值;True:包含

bins = 3,分区步骤

1) 找出最大值  32000 ,最小值  3700

2) 求两者的差值32000 - 3700 = 28300

3) 区间

(3700 ~ 3700 + 28300/3]   低

(3700 + 28300/3 ~ 3700 + 28300/3*2]   中

(3700 + 28300/3*2 ~ 32000]   高

2)  按自定义价格金额大小分为3组,将每条数据都打上高中低的标签

df4 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df4['价格高中低'] = pd.cut(x=df4['价格'], bins=[0,3000,8000,210000],labels=['低', '中', '高'])
df4

3) 分箱后并排序

df2 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df2[['价格', '区间']].sort_values(['价格'])

df2 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000])
df2[['价格', '区间']].sort_values(['价格'])

 


http://www.ppmy.cn/server/134576.html

相关文章

体验先行者平台的一键生成ai神器

各种AI工具层出不穷。我有幸试用了一款功能强大的AI工具,它大大提高了我的工作效率和产能,让我能够将精力集中在最有价值的部分。 文字处理助手:无论是快速创作文章、博客等内容,还是提升文字质量,让表达更精准&#x…

【SpringCloud】基础问题

文章目录 spring-cloud-dependencies和spring-cloud-alibaba-dependencies的区别<dependencyManagement>和<dependencies>的区别<dependencyManagement><dependencies> 为什么在主函数上加上SpringBootApplication注解就可以扫描到对象为什么bootstrap…

无人机初识及应用概览

随着科技的飞速发展&#xff0c;无人机作为一种新兴技术产品&#xff0c;逐渐走进了我们的日常生活和学习中。以下是对该文内容的全面总结&#xff0c;旨在帮助读者更好地理解和认识无人机的基本概念、分类、应用领域、国产标杆品牌以及四旋翼无人机的具体组成。 一、无人机的概…

一文掌握异步web框架FastAPI(三)-- 依赖注入(Depends)、中间件(日志记录、错误处理、身份验证、压缩响应、添加响应头)

接:一文掌握异步web框架FastAPI(二)-CSDN博客 目录 六、依赖注入 1、基本用法 2、使用依赖注入传递配置参数 3、使用依赖注入进行权限验证 4、使用依赖注入管理资源 5、使用依赖注入进行依赖项缓存 6、使用依赖注入进行跨模块依赖管理 7、使用依赖注入进行请求上下文…

从0开始深度学习(20)——延后初始化和自定义层

一般情况下&#xff0c;模型参数在被创建时就被立即初始化了&#xff0c;但如果使用了延后初始化技术&#xff0c;就能在首次传入数据后&#xff0c;再初始化参数&#xff0c;旨在输入维度未知的情况下&#xff0c;预定义灵活的模型&#xff0c;动态推断各个层的参数大小。 有时…

12、论文阅读:利用生成对抗网络实现无监督深度图像增强

Towards Unsupervised Deep Image Enhancement With Generative Adversarial Network 摘要介绍相关工作传统图像增强基于学习的图像增强 论文中提出的方法动机和目标网络架构损失函数1) 质量损失2) 保真损失3&#xff09;身份损失4&#xff09;Total Loss 实验数据集实现细节评…

多线程初阶(七):单例模式指令重排序

目录 1. 单例模式 1.1 饿汉模式 1.2 懒汉模式 2. 懒汉模式下的问题 2.1 线程安全问题 2.2 如何解决 --- 加锁 2.3 加锁引入的新问题 --- 性能问题 2.4 指令重排序问题 2.4.1 指令重排序 2.4.2 指令重排序引发的问题 1. 单例模式 单例模式, 是设计模式中最典型的一种模…

GitLab CVE-2024-6389、CVE-2024-4472 漏洞解决方案

极狐GitLab 近日发布安全补丁版本17.3.2, 17.2.5, 17.1.7&#xff0c;修复了17个安全漏洞&#xff0c;本分分享其中两个漏洞 CVE-2024-6389、CVE-2024-4472 两个漏洞详情及解决方案。 极狐GitLab 正式推出面向 GitLab 老旧版本免费用户的专业升级服务&#xff0c;为 GitLab 老…