mars.dataframe.cut#

mars.dataframe.cut(x, bins, right: 布尔型 = True, labels=None, retbins: 布尔型 = False, precision: 整型 = 3, include_lowest: 布尔型 = False, duplicates: 字符串 = 'raise', ordered: 布尔型 = True)[来源]#

将值分成离散区间。

当您需要将数据值分段并排序到区间时,请使用 cut。这个功能对于将连续变量转换为分类变量也很有用。例如,cut 可以将年龄转换为年龄范围的组。支持将数据分成相等数量的区间,或预先指定的区间数组。

Parameters
  • x (类数组) – 输入的数组需要被分箱。必须是一维的。

  • bins (int, 一系列标量, 或 IntervalIndex) –

    用于分箱的标准。

    • int : 定义在x范围内的等宽分箱数量。x的范围在每侧扩展了0.1%,以包含x的最小值和最大值。

    • 一系列标量 : 定义允许非均匀宽度的分箱边界。不对x的范围进行扩展。

    • IntervalIndex : 定义要使用的确切分箱。注意,bins的IntervalIndex必须是不重叠的。

  • right (bool, 默认值为 True) – 指示 bins 是否包含最右边的边界。如果 right == True(默认值),那么 bins [1, 2, 3, 4] 表示 (1,2], (2,3], (3,4]。当 bins 是一个 IntervalIndex 时,这个参数会被忽略。

  • labels (数组False, 默认为 None) – 指定返回的区间的标签。必须与结果区间的长度相同。如果为 False,则仅返回区间的整数指示。这个参数会影响输出容器的类型(见下文)。当 bins 是一个 IntervalIndex 时,该参数被忽略。如果为 True,则会引发错误。

  • retbins (bool, 默认为 False) – 是否返回区间。如果将区间作为标量提供,这一选项很有用。

  • precision (int, 默认 3) – 存储和显示 bins 标签的精度。

  • include_lowest (bool, default False) – 第一个区间是否应该左闭合。

  • duplicates ({默认 'raise', 'drop'}, 可选) – 如果区间边界不是唯一的,抛出 ValueError 或丢弃非唯一值。

  • ordered (bool, default True) – 标签是否有序。适用于返回类型 Categorical 和 Series(具有 Categorical 数据类型)。如果为 True,结果 的分类将是有序的。如果为 False,结果的分类将是 无序的(必须提供标签)。

Returns

  • out (分类,序列或张量) – 一个类数组对象,表示每个值所在的相应区间 of x。类型取决于labels的值。

    • True(默认) : 对于序列x返回一个序列,或者对于所有其他输入返回一个 分类。存储的值为区间数据类型。

    • 标量序列 : 对于序列x返回一个序列,或者对于所有其他输入返回一个 分类。存储的值为序列中的类型。

    • False : 返回一个整数张量。

  • bins (张量或区间索引。) – 计算或指定的区间。仅在retbins=True时返回。 对于标量或序列bins,这是一个包含计算区间的张量。如果设置duplicates=dropbins将删除非唯一区间。对于区间索引bins,这等于bins

另请参阅

qcut

根据排名或样本分位数将变量离散化为相等大小的桶。

Categorical

用于存储来自固定值集合的数据的数组类型。

Series

带有轴标签的一维数组(包括时间序列)。

IntervalIndex

不可变索引实现一个有序的、可切片的集合。

备注

任何NA值在结果中将为NA。超出范围的值在结果的序列或分类对象中将为NA。

示例

离散化为三个大小相等的区间。

>>> import mars.tensor as mt
>>> import mars.dataframe as md
>>> md.cut(mt.array([1, 7, 5, 4, 6, 3]), 3).execute()
... 
[(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], ...
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] ...
>>> md.cut(mt.array([1, 7, 5, 4, 6, 3]), 3, retbins=True).execute()
... 
([(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], ...
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] ...
array([0.994, 3.   , 5.   , 7.   ]))

发现相同的箱,但为它们分配特定的标签。请注意,返回的类别的类别是 标签 并且是有序的。

>>> md.cut(mt.array([1, 7, 5, 4, 6, 3]),
...        3, labels=["bad", "medium", "good"]).execute()
[bad, good, medium, medium, good, bad]
Categories (3, object): [bad < medium < good]

ordered=False将导致在传递标签时类别无序。该参数可以用于允许非唯一标签:

>>> md.cut(np.array([1, 7, 5, 4, 6, 3]), 3,
...        labels=["B", "A", "B"], ordered=False).execute()
['B', 'B', 'A', 'A', 'B', 'B']
Categories (2, object): ['A', 'B']

labels=False 表示您只想要返回箱子。

>>> md.cut([0, 1, 1, 2], bins=4, labels=False).execute()
array([0, 1, 1, 3])

将一个系列作为输入返回具有分类数据类型的系列:

>>> s = md.Series(mt.array([2, 4, 6, 8, 10]),
...               index=['a', 'b', 'c', 'd', 'e'])
>>> md.cut(s, 3).execute()
... 
a    (1.992, 4.667]
b    (1.992, 4.667]
c    (4.667, 7.333]
d     (7.333, 10.0]
e     (7.333, 10.0]
dtype: category
Categories (3, interval[float64]): [(1.992, 4.667] < (4.667, ...

将一个序列作为输入返回一个带有映射值的序列。它用于根据区间对数值进行映射。

>>> s = md.Series(mt.array([2, 4, 6, 8, 10]),
...               index=['a', 'b', 'c', 'd', 'e'])
>>> md.cut(s, [0, 2, 4, 6, 8, 10], labels=False, retbins=True, right=False).execute()
... 
(a    0.0
 b    1.0
 c    2.0
 d    3.0
 e    NaN
 dtype: float64, array([0, 2, 4, 6, 8, 10]))

当 bins 不唯一时,可选用 drop

>>> md.cut(s, [0, 2, 4, 6, 10, 10], labels=False, retbins=True,
...        right=False, duplicates='drop').execute()
... 
(a    0.0
 b    1.0
 c    2.0
 d    3.0
 e    NaN
 dtype: float64, array([0, 2, 4, 6, 10]))

传递一个 IntervalIndex 给 bins 会导致这些类别完全匹配。请注意,IntervalIndex 未覆盖的值将被设置为 NaN。0 位于第一个区间的左侧(该区间右侧是闭合的),而 1.5 落在两个区间之间。

>>> bins = md.Index(pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)]))
>>> md.cut([0, 0.5, 1.5, 2.5, 4.5], bins).execute()
[NaN, (0, 1], NaN, (2, 3], (4, 5]]
Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]