今天偶然用到pandas的cut方法,相当好用,不过也有问题要解决,主要看一些容易困惑的地方。
pandas.cut :
有什么用?
当我们想要切分数据,或者对数据进行划分,也就是把一组数据分散成离散的间隔,那就要用到 cut 了。
cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')
# Bin values into discrete intervals.
参数都有什么含义:
x: 被切分的类数组(array-like)数据, 前提是必须是1-维 的。
bins:被切分后的区间(我习惯称为“箱”或者“桶”),主要有三种形式: int, sequence of scalars, or pandas.IntervalIndex
- 一个int型的标量
当bins为一个int型的标量时,代表将x平分成bins份。x的范围在每侧扩展0.1%,以包括x的最大值和最小值。
标量划分:
print(pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3))
# 计划分成3个区间 每个数 放入不同的分箱中
- 标量序列
标量序列定义了被分割后每一个bin的区间边缘,此时x没有扩展。 - pandas.IntervalIndex
定义要使用的精确区间。
right
:bool型参数,默认为True,表示是否包含区间右部。比如如果bins=[1,2,3],right=True,则区间为(1,2],(2,3];right=False,则区间为[1,2),[2,3)。
不过这里很容易使人疑惑。来看个例子:
right=True的情况:
s = pd.Series(np.array([2, 4, 6, 8, 10]),index=['a', 'b', 'c', 'd', 'e'])
pd.cut(s, [0, 2, 4, 6, 10, 10], labels=False, retbins=True, right=True, duplicates='drop')
# 这时候的划分 (0, 2], (2, 4], (4, 6], (6, 10] 注意:duplicates='drop'表示保证划分是唯一的
right=False的情况:
s = pd.Series(np.array([2, 4, 6, 8, 10]),index=['a', 'b', 'c', 'd', 'e'])
pd.cut(s, [0, 2, 4, 6, 10, 10], labels=False, retbins=True, right=True, duplicates='drop')
# 这时候的划分 [0, 2), [2, 4), [4, 6), [6, 10) 注意:duplicates='drop'表示保证划分是唯一的
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
:允许。