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') #0.23.4
    

    参数含义

    x:被切分的类数组(array-like)数据,必须是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型的参数,表示是否将分割后的bins返回,当bins为一个int型的标量时比较有用,这样可以得到划分后的区间,默认为False。
    precision:保留区间小数点的位数,默认为3.
    include_lowest:bool型的参数,表示区间的左边是开还是闭的,默认为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]) #年龄数据
    

    将ages平分成5个区间

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

    输出:

    [(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中。

    参考

    1. https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.cut.html
  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/sench/p/10128216.html
Copyright © 2011-2022 走看看