zoukankan      html  css  js  c++  java
  • pandas.cut

    用途

    pandas.cut用来把一组数据分割成离散的区间。比如一组年龄数据,pandas.cut将年龄分割成不同的年龄段并打上标签。

    原型

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

    参数含义

    x:被切分的类数组数据,必须是1维的(不能是DataFrame)。 

    bins:bins是被切割后的区间,有3种形式:int、数组、pandas.IntervalIndex

    • int:当 bins 为 int 型标量时,代表将 x 平分成 bins 份。x的范围在每侧扩展0.1%,以包括x的最大值和最小值。
    • 数组:数组定义了被分割后每个 bin 的区间边缘,此时x没有扩展。
    • pandas.IntervalIndex:定义要使用的精确区间。

    right:bool型,默认True。表示是否包含区间右部。比如:bins=[1,2,3], right=True,则区间为(1,2],(2,3];right=False,则区间为(1,2),(2,3)。

    labels:给分割后的bins打标签,比如把年龄x分割成年龄段bins后,可以给年龄段打上诸如青年、中年的标签。labels的长度必须和划分后的区间长度相等,比如bins=[1,2,3],划分后有2个区间(1,2],(2,3],则labels的长度必须为2。如果指定labels=False,则返回x中的数据在第几个bin中(从0开始)。

    retbins:bool型,默认为False。表示是否将分割后的bins返回,当bins为一个int型的标量时比较有用,这样得到划分后的区间。

    precision:保留区间小数点的位数,默认为3。

    include_lowest:bool型,默认为False。表示区间的左边是开还是闭的,当为False,不包含区间左部。

    duplicates:是否允许重复区间。raise:不允许,drop:允许。

    返回值

    out:一个pandas.Categorical,Series或ndarray类型的值,代表区分后x中的每个值在哪个bin(区间)中,如果指定了labels,则返回对应的label。

    bins:分割后的区间,当指定retbins为True时返回。

    例子

    import numpy as np
    import pandas as pd
    
    ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])
    print(ages)
    [  1   5  10  40  36  12  58  62  77  89 100  18  20  25  30  32]
    

    将ages平分成5个区间

    pd.cut(ages, 5)
    # 20.8 = 1 +(100-1)/5 = 1 + 19.8
    # 40.6 = 20.8 + 19.8
    # 60.4 = 40.6 + 19.8
     
    [(0.901, 20.8], (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], ..., (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], (20.8, 40.6]]
    Length: 16
    Categories (5, interval[float64]): [(0.901, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] < (80.2, 100.0]]

    可以看到ages被平分成5个区间,且区间两边都有扩展以包含最大值和最小值。

    将ages平分成5个区间并指定labels

    ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
    pd.cut(ages, 5, labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
    [婴儿, 婴儿, 婴儿, 青年, 青年, ..., 婴儿, 婴儿, 青年, 青年, 青年]
    Length: 16
    Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]

    给ages指定区间进行分割

    ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
    pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
     
    [婴儿, 婴儿, 青年, 壮年, 壮年, ..., 青年, 青年, 中年, 中年, 壮年]
    Length: 16
    Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]

    这里不再平分ages,而是将ages分成5个区间(0, 5],(5, 20],(20, 30],(30,50],(50,100]。

    返回分割后的 bins

    令 retbins=True 即可

    ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
    pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"],retbins=True)
     
    ([婴儿, 婴儿, 青年, 壮年, 壮年, ..., 青年, 青年, 中年, 中年, 壮年]
     Length: 16
     Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年],
     array([  0,   5,  20,  30,  50, 100]))

    只返回 x 中的数据在哪个 bin 

    令 labels=False 即可 

    ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
    pd.cut(ages, [0,5,20,30,50,100], labels=False)
     
    array([0, 0, 1, 3, 3, 1, 4, 4, 4, 4, 4, 1, 1, 2, 2, 3], dtype=int64)

    第一个0表示1在第0个bin中。 

    来自: ColdCode

  • 相关阅读:
    YUI(YUIcompressor)压缩参数选项
    js进制转换两则
    软件代码生成工具软工厂V2.0版本上线!欢迎新老用户免费使用!
    软件代码自动化生成工具我们该不该用!
    软件代码生成工具软工厂V2.0版本免费使用地址+教学视频,快速完成开发任务。
    转发在.NET上使用ZeroMQ
    . Net环境下消息队列(MSMQ)对象的应用
    消息队列软件产品大比拼
    ubuntu服务器安装指南
    简单的分布式应用程序日志记录器(logger)-基于MSMQ(消息队列)
  • 原文地址:https://www.cnblogs.com/keye/p/13218620.html
Copyright © 2011-2022 走看看