Сообщить об ошибке.

Функция cut() модуля pandas в Python, интервалы для группировки

Вычисляет интервалы для группировки значений последовательности

Синтаксис:

import pandas

idx = pandas.cut(x, bins, right=True, labels=None, retbins=False, 
                 precision=3, include_lowest=False, 
                 duplicates='raise', ordered=True)

idx = pandas.qcut(x, q, labels=None, retbins=False, 
                  precision=3, duplicates='raise')

Параметры:

  • x - входной массив, который необходимо разбить на дискретные интервалы. Должен быть одномерным.

  • q - количество квантилей. 10 для децилей, 4 для квартилей и т. д. Альтернативный массив квантилей, например [0, .25, .5, .75, 1.] для квартилей.

  • bins - критерии для объединения. Принимает:

    • int: определяет количество ячеек одинаковой ширины в диапазоне x . Диапазон x будет расширен на 0.1% с каждой стороны, чтобы включить минимальное и максимальное значения x.
    • последовательность скаляров : определяет границы групп с учетом неравномерной ширины интервалов. Расширение диапазона значений x не выполняется.
    • pandas.IntervalIndex: определяет точные ячейки, которые будут использоваться. Обратите внимание, что IntervalIndex для ячеек не должен перекрываться.

  • right=True - указывает, включает ли аргумент bins правый край или нет. Если right=True (значение по умолчанию), то ячейки [1, 2, 3, 4] указывают (1,2], (2,3], (3,4]. Этот аргумент игнорируется, если bins является интервальным индексом.

  • labels=None - задает метки для возвращаемых ячеек. Должен быть той же длины, что и результирующие ячейки. Если False, то возвращает только целочисленные показатели ячеек. Этот аргумент влияет на тип возвращаемого контейнера. Аргумент labels игнорируется, если bins является интервальным индексом. Если True, то выдается сообщение об ошибке. При ordered=False должны быть указаны метки.

  • retbins=False - возвращать рассчитанные группы bins или нет. Полезно, когда bins предоставляется в виде последовательности скаляров.

  • precision=3 - точность хранения и отображения меток контейнеров

  • include_lowest=False - должен ли первый интервал быть включенным слева или нет.

  • duplicates='raise - если края интервала не уникальны, то поднимает ValueError или отбрасывает дублирующие значения. Принимает значения 'raise' и 'drop'.

  • ordered=True - упорядочены метки или нет. Применяется к возвращаемым типам pandas.Categorical и Seriesdtype: category). Если True, то результирующий pandas.Categorical будет упорядочен.

Возвращает одно или два значения:

  1. pandas.Categorical, pandas.Series или numpy.ndarray, который представляет соответствующий интервал для каждого значения x. Тип зависит от значения аргумента labels.

    • labels=None (по умолчанию): возвращает Series для серии x или pandas.Categorical для всех остальных входных данных. Значения, хранящиеся внутри, имеют тип интервальный dtype.
    • в labels передается последовательность скаляров: возвращает Series для серии x или pandas.Categorical для всех других входных данных. Значения, хранящиеся внутри, соответствуют типу последовательности.
    • labels=False: возвращает массив целых чисел.

  2. если аргумент retbins=True, то дополнительно возвращается вычисленные или указанные интервалы bins ( или IntervalIndex). Для скалярных ячеек или ячеек последовательности это numpy.ndarray с вычисленными группами. Если установлен аргумент duplicates=drop, то из контейнеров будут удалены дубликаты. Для интервалов IntervalIndex возвращаются интервалы.

Описание функции pandas.cut()

Функция pandas.cut() модуля pandas разбивает массив значений на дискретные интервалы (группы).

Функция pandas.cut() используется, когда стоит необходимость сегментировать и сортировать значения данных по группам. Она также полезна для перехода от непрерывной переменной к категориальной переменной. Например, pandas.cut() может преобразовать возраст в группы возрастных диапазонов. Поддерживает объединение в равное количество ячеек или заранее заданный массив.

Другими словами, функция pandas.cut() вычисляет группировки для значений входного массива и часто используется для преобразования непрерывных переменных в дискретные или категориальные переменные:

Целочисленные bins образуют ячейки равной ширины.

>>> import numpy as np
>>> import pandas as pd
>>> ages = np.array([10, 15, 13, 12, 23, 25, 28, 59, 60])
>>> pd.cut(ages, bins=3)
# [(9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], 
# (9.95, 26.667], (26.667, 43.333], (43.333, 60.0], (43.333, 60.0]]
# Categories (3, interval[float64, right]): [(9.95, 26.667] < (26.667, 43.333] < (43.333, 60.0]]

Список границ интервалов назначит интервал для каждой переменной.

>>> pd.cut(ages, bins=[0, 18, 35, 70])
# [(0, 18], (0, 18], (0, 18], (0, 18], (18, 35], (18, 35], (18, 35], (35, 70], (35, 70]]
# Categories (3, interval[int64, right]): [(0, 18] < (18, 35] < (35, 70]]

Если аргумент bins является IntervalIndex, то он будет использоваться для группировки переданных данных.

>>> pd.cut(ages, bins=pd.IntervalIndex.from_breaks([0, 40, 70]))
# [(0, 40], (0, 40], (0, 40], (0, 40], (0, 40], (0, 40], (0, 40], (40, 70], (40, 70]]
# Categories (2, interval[int64, right]): [(0, 40] < (40, 70]]

Функция pandas.qcut() разбивает массив значений в сегменты одинакового размера на основе ранга или квантилей (аргумент q). Например, 1000 значений для 10 квантилей создадут категориальный объект, указывающий принадлежность к квантилю для каждой точки данных.

Значения, выходящие за пределы, в результирующем объекте pandas.Categorical будут заполнены NA.

>>> pd.qcut(range(5), 4)
# [(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
# Categories (4, interval[float64, right]): [(-0.001, 1.0] < (1.0, 2.0] ...

>>> pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
# ['good', 'good', 'medium', 'bad', 'bad']
# Categories (3, object): ['good' < 'medium' < 'bad']

>>> pd.qcut(range(5), 4, labels=False)
# array([0, 0, 1, 2, 3])

Примеры использования pandas.cut():

Любые значения NA в результате будут NA. Значения, выходящие за пределы, в результирующем объекте Series или pandas.Categorical объекте будут иметь значение NA.

Разделим на три ячейки/группы одинакового размера.

>>> import numpy as np
>>> import pandas as pd
>>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3)
# [(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (0.994, 3.0]]
# Categories (3, interval[float64, right]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]

Аргумент retbins=True дополнительно возвращает рассчитанные ячейки/группы

>>> out, bins = pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3, retbins=True)
>>> out
# [(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (0.994, 3.0]]
# Categories (3, interval[float64, right]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]
>>> bins
# array([0.994, 3.   , 5.   , 7.   ])

Ра считывает ячейки/группы так-же, но присваивает им определенные метки. Обратите внимание, что категории в возвращаемой объекте являются метками и упорядочены.

>>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3, labels=["bad", "medium", "good"])
# ['bad', 'good', 'medium', 'medium', 'good', 'bad']
# Categories (3, object): ['bad' < 'medium' < 'good']

Аргумент ordered=False приведет к неупорядоченным категориям при передаче меток. Этот аргумент можно использовать для разрешения неуникальных меток:

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

При передаче Series в качестве входных данных - возвращает Series с dtype: category:

>>> s = pd.Series(np.array([2, 4, 6, 8, 10]), index=['a', 'b', 'c', 'd', 'e'])
>>> pd.cut(s, 3)
# 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, right]): 
# [(1.992, 4.667] < (4.667, 7.333] < (7.333, 10.0]]

Передача Series в качестве входных данных, возвращает Series со значением сопоставления. Используется для численного сопоставления интервалов на основе интервалов.

>>> s = pd.Series(np.array([2, 4, 6, 8, 10]), index=['a', 'b', 'c', 'd', 'e'])
>>> s
a     2
b     4
c     6
d     8
e    10
dtype: int64

>>> out, bins = pd.cut(s, [0, 2, 4, 6, 8, 10], labels=False, retbins=True, right=False)
>>> out
# (a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    NaN
# dtype: float64 

>>> bins
# array([ 0,  2,  4,  6,  8, 10]))

Когда ребра ячейки bins имеют дубликаты, можно использовать аргумент drop.

>>> pd.cut(s, [0, 2, 4, 6, 10, 10], labels=False, retbins=True, right=False)
# Traceback (most recent call last):
# ...
# ValueError: Bin edges must be unique: array([ 0,  2,  4,  6, 10, 10]).
# You can drop duplicate edges by setting the 'duplicates' kwarg

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

Передача в bins значения типа pandas.IntervalIndex приводит именно к этим категориям. Обратите внимание, что значения, не охватываемые pandas.IntervalIndex, устанавливаются в NaN. 0 находится слева от первой ячейки (которая закрыта справа), а 1.5 находится между двумя группами.

>>> bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])
>>> pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)
# [NaN, (0.0, 1.0], NaN, (2.0, 3.0], (4.0, 5.0]]
# Categories (3, interval[int64, right]): [(0, 1] < (2, 3] < (4, 5]]