学科分类
目录
数据分析

离散化连续数据

有时候我们会碰到这样的需求,例如,将有关年龄的数据进行离散化(分桶)或拆分为“面元”,直白来说,就是将年龄分成几个区间。 Pandas 的 cut ()函数能够实现离散化操作,该函数的语法格式如下:

pandas.cut(x,bins,right = True,labels = None,retbins = False,precision = 3,
           include_lowest = False,duplicates ='raise' )

上述函数中常用参数表示的含义如下:

(1) x:表示要分箱的数组,必须是一维的。

(2) bins:接收int和序列类型的数据。如果传入的是int类型的值,则表示在x范围内的等宽单元的数量(划分为多少个等间距区间);如果传入的是一个序列,则表示将x划分在指定的序列中,若不在此序列中,则为NaN。

(3) right:是否包含右端点,决定区间的开闭,默认为True。

(4) labels:用于生成区间的标签。

(5) retbins:是否返回bin。

(6) precision:精度,默认保留三位小数。

(7) include_lowest:是否包含左端点。

cut()函数会返回一个Categorical对象,我们可以将其看作一组表示面元名称的字符串,它包含了分组的数量以及不同分类的名称。

假设当前有一组年龄数据,需要将这组年龄数据划分为0-12岁、12-25岁、25-45岁、45-50岁、50岁以上共5种类型,图1是将这些数据经过面元划分后的对比效果。

img

图1 面元化处理过程

接下来,我们通过一个示例来演示如何使用cut()函数将这组年龄数据进行面元划分,具体代码如下:

In [43]: import pandas as pd
         # 使用pandas的cut函数划分年龄组
         ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 32]
         bins = [0, 18, 25, 35, 60, 100]
         cuts = pd.cut(ages, bins)
         cuts
 Out[43]:
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (35, 60], 
(25, 35], (60, 100], (35, 60], (25, 35]]
Length: 11
Categories (5, interval[int64]): [(0, 18] < (18, 25] < (25, 35] < (35, 60) < (60, 100))

上述代码中,定义了表示年龄数据集和划分规则的变量ages和bins,然后调用cut()函数将ages按照bins的划分规则进行分组。上述示例返回了一个Categories类对象,它包含了面元划分的个数以及各区间的范围。

Categories对象中的区间范围跟数学符号中的“区间”一样,都是用圆括号表示开区间,用方括号则表示闭区间。如果希望设置左闭右开区间,则可以在调用cut()函数时传入right=False进行修改,示例代码如下。

In [44]: pd.cut(ages, bins=bins, right=False)
Out[44]:
[[18, 25), [18, 25), [25, 35), [25, 35), [18, 25), ..., [35, 60), [25, 35), 
[60, 100), [35, 60), [25, 35)]
Length: 11
Categories (5, interval[int64]): [[0, 18) < [18, 25) < [25, 35) < [35, 60) < [60, 100)]
点击此处
隐藏目录