在数据分析过程中, 我们经常需要将一个连续型的数据转换为离散型数据。
例如一列年龄数据, 我们可能会需要根据需要将其转换成"少年,青年, 中年, 老年"。
这个过程就称之为数据的离散化, 离散化后数据变得更加简单清晰, 经常会对我们的分析有一定帮助。
有些数据挖掘算法,特别是某些分类算法(如朴素贝叶斯),要求数据是分类属性形式(类别型属性)这样常常需要将连续属性变换成分类属性(离散化,Discretization)。
另外,如果一个分类属性(或特征)具有大量不同值,或者某些值出现不频繁,则对于某些数据挖掘任务,通过合并某些值减少类别的数目可能也是有帮助的。
在Pandas中, 我们使用函数pd.cut对数据进行切分处理。
例如我们数据中的价格列, 是一列连续浮点型数据, 那么我们可以按照价格从高到底, 将数据分成低价, 中价, 高价三类。
pd.cut参数说明:
item_orders = pd.read_csv('/data/Items_order.csv')
# 均匀切分成三份
pd.cut(item_orders.价格, 3)
bins参数传递一个整数, 得到的效果就是按照数据从大到小均匀切分成三份。
这里按照从0-29.393, 29.393-58.697, 58.697-88 均匀切分成三份, 容易看出, 三段区间的距离几乎是相同的。
我们可以通过label参数给切割后的几个类别设置名称标签。
pd.cut(item_orders.价格, 3, labels=['低价', '中价', '高价'])
指定切割位置。
如果想要自己指定从哪里进行切割, 可以使用列表传递切割位置。
pd.cut(item_orders.价格, [0,2, 5, 10, 100 ])
可以看到, 我们传递5个参数, 也就是将数据映射到4个区间当中。
我们再传递一个标签属性。
pd.cut(item_orders.价格, [0,2, 5, 10, 100 ], labels=['低价', '较低价', '中等', '高价'])
我们可以将切割好的数据传递回数据集, 变成一个新的列, 当然也可以覆盖原来的列
item_orders['价格分类'] = pd.cut(item_orders.价格, [0,2, 5, 10, 100 ], labels=['低价', '较低价', '中等', '高价'])
item_orders.head()
pd.qcut等深分箱:
在pd.cut函数中, 当我们把bins参数设置为整数时, 会按照数据从大到小进行等距切分。
但有的时候, 当数据分布不均匀时, 等距切分可能会导致某些类别中数据量大, 某些类别中数据量却非常小, 甚至没有。
如果切分后的类别分布不均衡, 在建模时很可能效果不好, 因此我们还有一个等深分箱函数。
在等深分箱中, 数据会尽可能的被均匀的分布在每一个类别当中, 但是每一个离散化的区间大小可能相差很大。
pd.qcut参数说明:
# 等深分箱切分成三份
pd.qcut(item_orders.价格, 3)
可以看到, 第一个区间跨度1.8, 而第二个区间跨度3, 第三个区间跨度83, 相差很多。
但三个区间的类别分布非常均衡
pd.qcut(item_orders.价格, 3).value_counts()