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]
. Этот аргумент игнорируется, если b
ins является интервальным индексом.
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
и Series
(с dtype: category
). Если True
, то результирующий pandas.Categorical
будет упорядочен.
pandas.Categorical
, pandas.Series
или numpy.ndarray
, который представляет соответствующий интервал для каждого значения x
. Тип зависит от значения аргумента labels
.
labels=None
(по умолчанию): возвращает Series
для серии x
или pandas.Categorical
для всех остальных входных данных. Значения, хранящиеся внутри, имеют тип интервальный dtype
.labels
передается последовательность скаляров: возвращает Series
для серии x или pandas.Categorical
для всех других входных данных. Значения, хранящиеся внутри, соответствуют типу последовательности.labels=False
: возвращает массив целых чисел.если аргумент 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]]