手把手教你用pandas做数据区间划分

本文介绍了如何使用Pandas的cut()方法对数据进行区间划分,包括自动和自定义区间划分,并展示了如何设置区间标签。通过案例分析了年龄和分数数据,展示了不同right参数对区间边界的影响,以及如何利用pivot_table进行数据分布统计。同时,给出了为数据添加区间和标签的示例。
摘要由CSDN通过智能技术生成

在数据分析的过程中,经常会遇到:年龄,收入,价格以及类似的数据,在数据分析前,需要将这些数据划分到一系列区间中,再将区间进行不同的编码,对编码后的数据进行分析。

在pandas中可以使用pandas.cut()方法实现对数据的区间划分,以及对区间进行标记。 


案例数据

 以name,age,score为例,使用pandas.cut()方法对age、score进行区间划分。

import pandas as pdimport numpy as np
df = 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],})

数据形式展示:

 nameagescore
0A2313
1B2623
2C3722
3D4676
4E8556
5F1289
6G5399
7H80100
8I6610
9J3254

pandas.cut()介绍

用来将数据划分为不同的区间   

x:array型数据 DataFrame每列数据都是array型数据

bins:传入int型数据,表示划分的区间个数,传入list型数据,表示自定义的区间

labels: 与bins对应区间的标签(默认为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: categoryCategories (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: categoryCategories (6, interval[int64]): [(10, 20] < (20, 30] < (30, 50] < (50, 70] < (70, 80] < (80, 90]]
# b数据区间retbins=Truearray([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: category Categories (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: category Categories (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: categoryCategories (3, object): ['不及格' < '良好' < '优秀']

 

给数据加上区间和标签

回到最开始,给df数据加上age_range和score_label列。

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=["不及格","良好","优秀"])

代码运行结果:

 

简要分析

统计各年龄段数量

df["age_range"].value_counts()
# 分析结果(30, 50]    3(50, 70]    2(20, 30]    2(80, 90]    1(70, 80]    1(10, 20]    1Name: age_range, dtype: int64

查看各年龄段分布情况

pd.pivot_table(data=df,index="age_range",columns="score_label",values="name",aggfunc=lambda x:len(x),fill_value=0)
# 分析结果score_label  不及格  良好  优秀age_range      (10, 20]  0  0  1(20, 30]  2  0  0(30, 50]  2  1  0(50, 70]  1  0  1(70, 80]  0  0  1(80, 90]  1  0  0

---END---

 

往期精彩内容:

Pycharm 最新激活(持续更新)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bearx...

请作者喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值