pandas离散化函数cut()和qcut()

对连续性数据进行离散化处理,然后分类汇总,是处理数据的常用方法。pandas中提供两个函数cut()和qcut()对连续数据进行离散化处理。

1. cut()给定离散化方式,每个面元个体数不同

官方文档链接
用法: pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=‘raise’)
参数说明:

  • x: 要离散化的一维数组
  • bins: 离散化方式
    - (1)给定整数n,离散化成n个等宽面元,宽度为(max-min)/n
    - (2)给定常量序列[1, 2, 5, 10],则离散成(1,2],(2,5],(5,10]三个面元
    - (3)给定自定义区间序列,示例如下
>>>bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)], closed='right')#closed可选参数{‘left’, ‘right’, ‘both’, ‘neither’}
>>>pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)
[NaN, (0, 1], NaN, (2, 3], (4, 5]]
Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]
  • right: 指定面元区间bins左右开闭情况,默认True左开右闭(],False左闭右开[)。只对bins前两种参数方式有效
  • labels: 面元标签,数组长度需要与面元个数相等
    - None,以面元区间作为面元标签
    - 标签数组,指定每个面元的标签
    - False,返回整数数组,表示被分割数组每个元素属于第几个面元
pd.cut(np.array([1, 7, 5, 4, 6, 3]), bins=3, labels=None)
Out[40]: 
[(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (0.994, 3.0]]
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]

pd.cut(np.array([1, 7, 5, 4, 6, 3]), bins=3, labels=['a', 'b', 'c'])
Out[41]: 
[a, c, b, b, c, a]
Categories (3, object): [a < b < c]

pd.cut(np.array([1, 7, 5, 4, 6, 3]), bins=3, labels=False)
Out[42]: array([0, 2, 1, 1, 2, 0], dtype=int64)
  • retbins: 是否同时返回面元划分方式,默认False
pd.cut(np.array([1, 7, 5, 4, 6, 3]), bins=3, labels=['a', 'b', 'c'], retbins=True)
Out[62]: 
([a, c, b, b, c, a]
 Categories (3, object): [a < b < c], array([0.994, 3.   , 5.   , 7.   ]))
  • precision: 面元标签存储及展示的精度,默认3位小数
pd.cut(np.array([0.9, 6.5, 5.3, 2.3]), bins=3, precision=3)
Out[66]: 
[(0.894, 2.767], (4.633, 6.5], (4.633, 6.5], (0.894, 2.767]]
Categories (3, interval[float64]): [(0.894, 2.767] < (2.767, 4.633] < (4.633, 6.5]]

pd.cut(np.array([0.9, 6.5, 5.3, 2.3]), bins=3, precision=4)
Out[67]: 
[(0.8944, 2.7667], (4.6333, 6.5], (4.6333, 6.5], (0.8944, 2.7667]]
Categories (3, interval[float64]): [(0.8944, 2.7667] < (2.7667, 4.6333] < (4.6333, 6.5]]
  • duplicates: 检测面元边界是否有重复,如果有则报错‘raise’(默认)或者删除重复边界’drop’
2. qcut()保证每个面元的个体数相同

官方文档链接
用法: pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=‘raise’)
参数说明: 大多数都跟cut()是一致的,下面只说不一致的

  • q: 给定分位数
    - 给定整数n,10表示十分位数,4表示四分位数。
    - 给定分数数数组,eg[0, 0.2, 0.4, 0.75, 1.0]
pd.qcut(range(20), 4)
Out[17]: 
[(-0.001, 4.75], (-0.001, 4.75], (-0.001, 4.75], (-0.001, 4.75], (-0.001, 4.75], ..., (14.25, 19.0], (14.25, 19.0], (14.25, 19.0], (14.25, 19.0], (14.25, 19.0]]
Length: 20
Categories (4, interval[float64]): [(-0.001, 4.75] < (4.75, 9.5] < (9.5, 14.25] < (14.25, 19.0]]

pd.qcut(range(20), [0, 0.2, 0.4, 0.75, 1.0])
Out[18]: 
[(-0.001, 3.8], (-0.001, 3.8], (-0.001, 3.8], (-0.001, 3.8], (3.8, 7.6], ..., (14.25, 19.0], (14.25, 19.0], (14.25, 19.0], (14.25, 19.0], (14.25, 19.0]]
Length: 20
Categories (4, interval[float64]): [(-0.001, 3.8] < (3.8, 7.6] < (7.6, 14.25] < (14.25, 19.0]]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值