zoukankan      html  css  js  c++  java
  • pandas 学习 第10篇:离散化和切分

    在数据分析中,通常需要把连续的数据离散化或拆分成多个区间(bin),这就需要用到cut()或qcut()函数。

    一,cut函数

    把值切分成离散的区间,有三种切分方式,第一种方式是制定区间的数量,把连续值平均切分;第二种方式是以标量值序列指定各个区间的边界值;第三种方式是以IntervalIndex 精确指定各个区间,区间之间不允许重叠。

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

    参数注释:

    • x:array-like
    • bins:如果是整数,表示切分区间的数量;如果是整数序列(从小到大),表示通过元素指定各个区间的边界;如果是IntervalIndex,表示精确指定各个区间。
    • right:是否包含区间的右边界
    • labels:为每一个区间指定一个标签
    • retbins:是否返回bins(切分的区间的边界)
    • precision:指定区间标签(bin label)的精度,通常是对浮点数标签来说,指定小数点后的位数
    • include_lowest:指定第一个区间是否包含最低值

    cut函数返回的是Categorical的对象,这是一个array-like对象,表示每一个x元素所在的区间。

    1,Categorical类型

    Categorical类型是指对list-like对象进行分类,返回值包括两部分,第一部分是列表,表示对原始list-like中各个元素进行分类之后的类标签,第二部分是类别信息。

    举个例子,返回值第一部分是一个列表,元素是1,2,3表示各个分类。第二部分是Categories信息,共分为3类,类标签的类型是int64,类别(bins)是[1,2,3]。

    >>> pd.Categorical([1, 2, 3, 1, 2, 3])
    [1, 2, 3, 1, 2, 3]
    Categories (3, int64): [1, 2, 3]

    2,指定切分区间的数量

    把ages列表平均划分为4个区间,返回的结果中,第一部分是区间的标签,这是由左开右闭的区间构成的列表;第二部分是元素的数量(Length),第三部分是分类信息,有4个分类,最后返回bins数组。

    >>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
    >>> cats=pd.cut(x=ages,bins=4,precision =0,retbins=True)
    >>> cats
    ([(20.0, 30.0], (20.0, 30.0], (20.0, 30.0], (20.0, 30.0], (20.0, 30.0], ..., (30.0, 40.0], (51.0, 61.0], (40.0, 51.0], (40.0, 51.0], (30.0, 40.0]]
    Length: 12
    Categories (4, interval[float64]): [(20.0, 30.0] < (30.0, 40.0] < (40.0, 51.0] < (51.0, 61.0]], array([19.959, 30.25 , 40.5 , 50.75 , 61. ]))

    2,指定切分区间的边界

    对ages列表进行划分,区间的边界由bins列表来指定

    >>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
    >>> bins=[18,25,35,60,100]
    >>> cats = pd.cut(ages,bins,right=True)
    >>> cats
    [(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
    Length: 12
    Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
    >>> 

    3,指定区分的区间

     通过from_breaks()函数来制定IntervalIndex,精确制定区间的边界,用于对连续的数据进行切分:

    >>> ages = [20,22,25,27,21,23,37,31,61,45,41,32]
    >>> breaks = pd.IntervalIndex.from_breaks([18,25,35,60,100])
    >>> breaks
    IntervalIndex([(18, 25], (25, 35], (35, 60], (60, 100]],
                  closed='right',
                  dtype='interval[int64]')
    >>> pd.cut(x=ages,bins=breaks)
    [(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
    Length: 12
    Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]

    二,qcut函数

    qcut()函数也是用于切分的函数,q是Quantile(分位数)的意思,基于分位数对连续数据进行切分。基于排序或分位数,把变量分散到大小相等的桶(bucket)中。

    例如,10个分位数的1000个值将产生一个分类对象,指示每个数据点的分位数隶属关系。

    For example 1000 values for 10 quantiles would produce a Categorical object indicating quantile membership for each data point.

    pandas.qcut(x, q, labels=None, retbins=False, precision=3)

    参数注释:

    • x:一维数组,或序列
    • q:分位数的个数(10是指10分位数,4是指4分位数),或者制定分位数的序列

    举个例子,指定分位数的序列,q=[0,0.2,0.9,1] 表示把从(0, 0.2]的分位数作为一个区间,把(0.2, 0.9]的分位数作为一个区间,把(0.9,1]的分位数作为一个区间:

    >>> ages=[20,22,25,27,21,23,37,31,61,45,41,32]
    >>> pd.qcut(x=ages,q=[0,0.5,0.9,1],precision=0)
    [(19.0, 29.0], (19.0, 29.0], (19.0, 29.0], (19.0, 29.0], ...,(45.0, 61.0], (29.0, 45.0], (29.0, 45.0]]
    Length: 12
    Categories (3, interval[float64]): [(19.0, 29.0] < (29.0, 45.0] < (45.0, 61.0]]

    参考文档:

    pandas General functions

  • 相关阅读:
    [错误处理]UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
    [已解决]使用 apt-get update 命令提示 ...中被配置了多次
    linux各种版本查看方法
    [Pandas技巧] 如何把pandas dataframe对象或series对象转换成list
    linux下终止相关操作
    [错误处理]Vim卡死,无法输入是怎么回事?是不是按了Ctrl+S
    批量修改文件名称方法
    pycharm配置 自动运行指定脚本
    pip安装超时,更换国内镜像源安装
    命令行特殊字符名字转义
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10225363.html
Copyright © 2011-2022 走看看