Python数据分析

Python数据分析 知识量:13 - 56 - 232

7.7 数据切分><

cut()函数- 7.7.1 -

数据切分就是将一组数据分隔为若干份。如果是把一段连续的值切分成若干段,每一段的值为一个分类,则可以将数据切分理解为把连续值转换成离散值的过程。

可以使用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时,还将同时返回分隔后的区间。

平均切分- 7.7.2 -

要将一组数据平均切分为若干份,可以将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可直接给出,而其他参数需要以“参数名=参数值”的形式给出。

指定切分区间- 7.7.3 -

除了平均切分,可以通过将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个切分区间。

指定标签- 7.7.4 -

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的值替换了默认的区间名称。注意:标签的个数与区间数量必须一致。

返回bins- 7.7.5 -

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。

返回数据在哪个区间- 7.7.6 -

对于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()函数- 7.7.7 -

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给出切分的个数。