1. 首页
  2. 问答社区

问答社区

pandas.cut的一些问题总结

xsmile 发布于 1个月前 分类:Python

今天偶然用到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
    定义要使用的精确区间。

rightbool型参数,默认为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开始)。
retbinsbool型的参数,表示是否将分割后的bins返回,当bins为一个int型的标量时比较有用,这样可以得到划分后的区间,默认为False。
precision保留区间小数点的位数,默认为3.
include_lowestbool型的参数,表示区间的左边是开还是闭的,默认为false,也就是不包含区间左部(闭)。
duplicates是否允许重复区间。有两种选择:raise:不允许,drop:允许。

0个回复

  • 暂无回复

联系我们

在线咨询:点击这里给我发消息

邮件:23683716@qq.com

跳至工具栏