Python数据分析 知识量:13 - 56 - 232
数据切分就是将一组数据分隔为若干份。如果是把一段连续的值切分成若干段,每一段的值为一个分类,则可以将数据切分理解为把连续值转换成离散值的过程。
可以使用cut()函数来实现数据切分,该函数的原型为:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
其参数的简要说明如下:
x 被切分的类数组(array-like)数据,必须是1维的(不能用DataFrame)。
bins 被切分后的区间。有3中形式:一个int型的标量、标量序列(数组)或者pandas.IntervalIndex。
right 表示是否包含区间右部。bool型参数,默认为True。
labels 给切分后的bins打标签,默认为None。labels的长度(个数)必须和切分后的区间长度(个数)相等。如果指定labels=False,则返回x中的数据在第几个bin中(从0开始)。
retbins 表示是否返回切分后的bins,bool型的参数,默认为False。
precision 保留区间小数点的位数,默认为3。
include_lowest 表示区间的左边是开还是闭的,bool型的参数,默认为false,即不包含区间左部。
duplicates 表示是否允许重复区间。当值为raise(默认)时表示不允许;值为drop时表示允许。
ordered 决定labels是否进行排序,bool型参数,默认为True。
对于cut()函数的参数bins的取值,有以下规定:
一个int型的标量:当bins为一个int型的标量时,代表将x平分成bins份。x的范围在每侧扩展0.1%,以包括x的最大值和最小值。
标量序列(数组):标量序列定义了被分割后每一个bin的区间边缘,此时x的范围不扩展。
pandas.IntervalIndex:定义要使用的精确区间。
cut()函数的返回值是一个pandas.Categorical、Series或者ndarray类型的值,代表分区后x中的每个值在哪个区间中。如果指定了labels,则返回对应的label。当retbins=True时,还将同时返回分隔后的区间。
要将一组数据平均切分为若干份,可以将cut()函数的参数bins设为一个int型的标量,标量的值就是切分的份数。
import numpy as np import pandas as pd arr=np.arange(10) print(arr) print(pd.cut(arr,2)) # 将数组切分为2份
运行结果为:
[0 1 2 3 4 5 6 7 8 9] [(-0.009, 4.5], (-0.009, 4.5], (-0.009, 4.5], (-0.009, 4.5], (-0.009, 4.5], (4.5, 9.0], (4.5, 9.0], (4.5, 9.0], (4.5, 9.0], (4.5, 9.0]] Categories (2, interval[float64]): [(-0.009, 4.5] < (4.5, 9.0]]
以上示例中,参数bins为2,即将数组arr切分为2份,且区间两边都有扩展以包含每个区间的最大值和最小值。
注意:使用cut()函数时,参数x和bins可直接给出,而其他参数需要以“参数名=参数值”的形式给出。
除了平均切分,可以通过将bins设为一组标量序列来指定切分区间。
import numpy as np import pandas as pd arr=np.arange(10) print(arr) print(pd.cut(arr,[-1,4,8,12]))
运行结果为:
[0 1 2 3 4 5 6 7 8 9] [(-1, 4], (-1, 4], (-1, 4], (-1, 4], (-1, 4], (4, 8], (4, 8], (4, 8], (4, 8], (8, 12]] Categories (3, interval[int64]): [(-1, 4] < (4, 8] < (8, 12]]
以上示例中,包含4个值的列表创建了3个切分区间。
cut()函数的参数labels默认为None,可以通过设置该参数,为每个切分区间设置标签。
import numpy as np import pandas as pd arr=np.arange(10) print(arr) print(pd.cut(arr,[-1,4,8,12],labels=['A','B','C']))
运行结果为:
[0 1 2 3 4 5 6 7 8 9] ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C'] Categories (3, object): ['A' < 'B' < 'C']
由以上示例可见,参数labels的值替换了默认的区间名称。注意:标签的个数与区间数量必须一致。
cut()函数可以返回用于指定切分区间的bins的值,设置retbins=True即可。
import numpy as np import pandas as pd arr=np.arange(10) print(arr) print(pd.cut(arr,[-1,4,8,12],retbins=True))
运行结果为:
[0 1 2 3 4 5 6 7 8 9] ([(-1, 4], (-1, 4], (-1, 4], (-1, 4], (-1, 4], (4, 8], (4, 8], (4, 8], (4, 8], (8, 12]] Categories (3, interval[int64]): [(-1, 4] < (4, 8] < (8, 12]], array([-1, 4, 8, 12]))
array([-1, 4, 8, 12])就是返回的bins。
对于cut()函数,设置labels=False,可以返回数据在区间的分布情况,即数据位于第几个区间。
import numpy as np import pandas as pd arr=np.arange(10) print(arr) print(pd.cut(arr,3,labels=False))
运行结果为:
[0 1 2 3 4 5 6 7 8 9] [0 0 0 0 1 1 1 2 2 2]
区间的序列从0开始计数,以上示例中,0-3位于第0个区间,4-6位于第1个区间,7-9位于第2个区间。
qcut()函数与cut()函数相似,也可以用于数据的切分。cut()函数按照数据的值进行分割,而qcut函数则是根据数据本身的数量来对数据进行分割,并且尽量保证每个分组里变量的个数相同。
qcut()函数的原型为:
pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
下面是一个示例:
import numpy as np import pandas as pd arr=np.arange(1,11) print(arr) print(pd.qcut(arr,2))
运行结果为:
[ 1 2 3 4 5 6 7 8 9 10] [(0.999, 5.5], (0.999, 5.5], (0.999, 5.5], (0.999, 5.5], (0.999, 5.5], (5.5, 10.0], (5.5, 10.0], (5.5, 10.0], (5.5, 10.0], (5.5, 10.0]] Categories (2, interval[float64]): [(0.999, 5.5] < (5.5, 10.0]]
qcut()函数不需要给出切分区间,只需要通过参数q给出切分的个数。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6