pandas数据划分区间
用pandas将数据划分区间
在数据分析的过程中,经常会遇到:年龄,收入,价格以及类似的数据,在数据分析前,需要将这些数据划分到一系列区间中,再将区间进行不同的编码,对编码后的数据进行分析。
在pandas中可以使用pandas.cut()方法实现对数据的区间划分,以及对区间进行标记。
案例数据
- 以name,age,score为例,使用pandas.cut()方法对age、score进行区间划分。
import pandas as pd
import numpy as npdf = pd.DataFrame(data={"name":["A","B","C","D","E","F","G","H","I","J"],"age":[23,26,37,46,85,12,53,80,66,32],"score":[13,23,22,76,56,89,99,100,10,54],
})
数据形式展示:
name | age | score | |
---|---|---|---|
0 | A | 23 | 13 |
1 | B | 26 | 23 |
2 | C | 37 | 22 |
3 | D | 46 | 76 |
4 | E | 85 | 56 |
5 | F | 12 | 89 |
6 | G | 53 | 99 |
7 | H | 80 | 100 |
8 | I | 66 | 10 |
9 | J | 32 | 54 |
pandas.cut()介绍
用来将数据划分为不同的区间
- x:array型数据(DataFrame的每一列数据都是array型数据)
- bins:传入int型数据,表示划分的区间个数,传入list型数据,表示自定义的区间
- labels:传入与bins对应区间的标签list型数据(默认为None)
- retbins:True表示返回划分的区间,False表示不返回划分的区间(默认为False)
- right:True表示左开右闭,False表示左闭右开(默认为True)
返回数据:
- x对应所在的区间,array类型
- retbins为True时,还会返回划分区间
一、自动划分区间
例如:bins=3,right=True,pandas会将数据划分为3个区间,划分方法,
(max-(max-min)/bins,max]>(60.667,85]
(max-(max-min)/bins*2,max-(max-min)/bins]>(36.333.60.667]
(max-(max-min)/bins*3,max-(max-min)/bins*2]==>(11.927, 36.333]
a,b = pd.cut(x=df["age"],bins=3,right=True,retbins=True)
# a,bins传入的是int类型,自动生成的区间
0 (11.927, 36.333]
1 (11.927, 36.333]
2 (36.333, 60.667]
3 (36.333, 60.667]
4 (60.667, 85.0]
5 (11.927, 36.333]
6 (36.333, 60.667]
7 (60.667, 85.0]
8 (60.667, 85.0]
9 (11.927, 36.333]
Name: age, dtype: category
Categories (3, interval[float64]): [(11.927, 36.333] < (36.333, 60.667] < (60.667, 85.0]]# b,自动划分的区间
array([11.927, 36.333, 60.667, 85.0])
二、自定义划分区间
eg:自定义一个年龄分段列表,age_bins = [10,20,30,50,70,80,90]
对应的区间为:[(10, 20] < (20, 30] < (30, 50] < (50, 70] < (70, 80] < (80, 90]]
这样pandas会按照age_bins指定的区间进行划分
age_bins = [10,20,30,50,70,80,90]
a,b = pd.cut(x=df["age"],bins=age_bins,right=True,retbins=True)
a和b的值:
# a返回的数据区间array对象
0 (20, 30]
1 (20, 30]
2 (30, 50]
3 (30, 50]
4 (80, 90]
5 (10, 20]
6 (50, 70]
7 (70, 80]
8 (50, 70]
9 (30, 50]
Name: age, dtype: category
Categories (6, interval[int64]): [(10, 20] < (20, 30] < (30, 50] < (50, 70] < (70, 80] < (80, 90]]# b数据区间retbins=True
array([10, 20, 30, 50, 70, 80, 90])
三、区间左边是否包含
使用场景:当age为80的时候,应该归为(70,80]还是[80,90),这是个问题
eg:bins = [10,20,30,50,70,80,90],right=True
对应的区间为:[(10, 20] < (20, 30] < (30, 50] < (50, 70] < (70, 80] < (80, 90]]
pd.cut(x=df.age,bins=age_bins,retbins=True,right=True)(0 (20, 30]1 (20, 30]2 (30, 50]3 (30, 50]4 (80, 90]5 (10, 20]6 (50, 70]7 (70, 80]8 (50, 70]9 (30, 50]Name: age, dtype: categoryCategories (6, interval[int64]): [(10, 20] < (20, 30] < (30, 50] < (50, 70] < (70, 80] < (80, 90]],array([10, 20, 30, 50, 70, 80, 90]))
bins = [10,20,30,50,70,80,90],right=False
对应的区间为:[[10, 20) < [20, 30) < [30, 50) < [50, 70) < [70, 80) < [80, 90)]
pd.cut(x=df.age,bins=age_bins,retbins=True,right=False)(0 [20, 30)1 [20, 30)2 [30, 50)3 [30, 50)4 [80, 90)5 [10, 20)6 [50, 70)7 [80, 90)8 [50, 70)9 [30, 50)Name: age, dtype: categoryCategories (6, interval[int64]): [[10, 20) < [20, 30) < [30, 50) < [50, 70) < [70, 80) < [80, 90)],array([10, 20, 30, 50, 70, 80, 90]))
四、区间加上标签
使用labels参数可以对区间加上标签,例如score列,小于60为不及格,60-80良好,80以上优秀
eg:bins:[0,60,80,100],labels:[“不及格”,“良好”,“优秀”]
返回的是对应的标签,而不是对应的区间
pd.cut(x=df.score,bins=[0,60,80,100],labels=["不及格","良好","优秀"])
代码运行结果:
0 不及格
1 不及格
2 不及格
3 良好
4 不及格
5 优秀
6 优秀
7 优秀
8 不及格
9 不及格
Name: score, dtype: category
Categories (3, object): ['不及格' < '良好' < '优秀']
给数据加上区间和标签
df["age_range"] = pd.cut(x=df["age"],bins=[10, 20, 30, 50, 70, 80, 90])
df["score_label"] = pd.cut(x=df["score"],bins=[0,60,80,100],labels=["不及格","良好","优秀"])
代码运行结果:
name | age | score | age_range | score_label | |
---|---|---|---|---|---|
0 | A | 23 | 13 | (20, 30] | 不及格 |
1 | B | 26 | 23 | (20, 30] | 不及格 |
2 | C | 37 | 22 | (30, 50] | 不及格 |
3 | D | 46 | 76 | (30, 50] | 良好 |
4 | E | 85 | 56 | (80, 90] | 不及格 |
5 | F | 12 | 89 | (10, 20] | 优秀 |
6 | G | 53 | 99 | (50, 70] | 优秀 |
7 | H | 80 | 100 | (70, 80] | 优秀 |
8 | I | 66 | 10 | (50, 70] | 不及格 |
9 | J | 32 | 54 | (30, 50] | 不及格 |
更多好玩的内容,欢迎关注微信公众号《帅帅的Python》
pandas数据划分区间相关推荐
- python 区间频数统计_pandas分区间,算频率的实例
如下所示: import pandas as pd path='F:/python/python数据分析与挖掘实战/图书配套数据.代码/chapter3/demo/data/catering_fish ...
- 是Excel的图,不!是R的图
原文章来源链接:https://brucezhaor.github.io/blog/2016/06/13/excel2ggplot/ 原文章作者:BruceZhaoR(RStats, interest ...
- 深度粗排模型的GMV优化实践:基于全空间-子空间联合建模的蒸馏校准模型
随着业务的不断发展,粗排模型在整个系统链路中变得越来越重要,能够显著提升线上效果.本文是对粗排模型优化的阶段性总结. 背景 在搜索.推荐.广告等大规模信息检索场景中,通常会将检索分为召回.粗排.精排三 ...
- 大数据中位数怎么运算_大数据查找中位数
前两天同学面试遇到的一道题,大数据怎么找出中位数.大数据 --> 所有数据不能一下子读入内存 中位数 --> 需要遍历所有数据 1. 题目 在一个大文件中有100亿个32位整数,乱序排列, ...
- 计算个人所得税最佳纳税额(以2019最新税法规则计算)
计算个人所得税最佳节税 年底了,2019年也参加了CPA税法的考试,闲来无事给大家分享一个昨天刚写的计算个人所得税的小程序.新鲜出炉,整个程序主要是基于2019年最新的个人所得税纳税规则计算最佳节税点 ...
- 利用pandas对一列/多列进行数据区间筛选
前言 如果不整活,那就是浪费生命 下面这个表,如果你想筛选出age大于等于18,小于等于30的行: 如果在mysql中整这种活很容易,用个where就可以了 在pandas中也有相当于where作用的 ...
- 用pandas实现固定区间的数据频数统计(pd.cut,pd.Series)
搜罗了一圈,终于找到了能够实现目的的代码 目标:对一组序列进行频数的统计,画出来就像hist,不过我要的是每个bin和对应的数据而不是图,而生成固定区间,我好进行后面的比值对比 首先具有数据分类功能的 ...
- numpy pandas 查找在一个区间中的值
import numpy as npa = np.random.randint(0,10,50)# 查找小于5,大于7的数据 a[(a > 5) & (a < 7)] # 返回 [ ...
- pandas按半小时区间分组统计
data.groupby(['col',data.START_HOUR.dt.floor('30Min')]).size().reset_index() 需要先将START_HOUR 采用pd.to_ ...
最新文章
- 当RxJava遇到AOP
- mysql建表影响效率_MySQL建表查询优化技巧
- 深入浅出mfc随笔——MFc程序的生死因果
- Android Svn 中 Bin ,Gen 目录不进行版本控制
- BundlePhobia
- 前端学习(2154):webpack横幅plugin的使用
- 纯数学教程 Page 325 例LXVIII (15) 调和级数发散
- Eclipse-报错:Could not create the Java virtual machine
- 一篇文章弄懂 JavaScript 中的 import
- hadoop中遇到的问题
- 网络安全——终端安全
- Linux学习简单教程和常用命令(小白学习法)
- 2021齐齐哈尔实验中学高考成绩查询,齐齐哈尔名列前茅的4所高中,成绩一目了然,谁是市内最强中学?...
- ioi2020集训队作业_IOI2020集训队作业
- 用python画星空-用python画星空源代码是什么?
- VSCode中将LaTeX的PDF阅读器设置为暗色
- eventBus VSvueX
- Android 鼠标样式修改
- Chomsky文法分类
- BERT模型—7.BERT模型在句子分类任务上的微调(对抗训练)
热门文章
- 2022-2-9 计算机组成原理 —— SIMD 和 超线程
- 2022-1-21 Leetcode.645.错误的集合
- 简单的ExpandableList控件例子
- php实现删除数据库中内容,php – 从数据库中删除内容,安全预防措施
- docker运行mysql性能_使用docker运行mysql
- php多图片生成flash,PHP_为php4加入动态flash文件的生成的支持,想象过在网站上动态生成flash - phpStudy...
- html5 桌面提醒参数,html5 桌面提醒:Notifycations应用介绍
- 游戏AI的缘起与进化
- em模型补缺失值_ML4fun系列(六):EM算法
- eclipse 下载 sdk