Функция qcut
Функция qcut применяется для дискретизации непрерывных данных
с разбиением на интервалы равной частоты (квантили). В отличие от
функции cut, где интервалы имеют равную ширину, qcut
формирует интервалы таким образом, чтобы в каждый попадало примерно
одинаковое количество наблюдений. Первым параметром передаётся
массив или столбец Series, вторым параметром указывается количество
интервалов (целое число) или список квантилей (от 0 до 1).
Результатом работы является категориальный объект или Series
с метками интервалов.
Синтаксис
pd.qcut(x, q, labels=None, retbins=False, duplicates='raise')
Основные параметры функции:
-
x- одномерный массив или Series для разбиения; -
q- количество интервалов (целое число) или список квантилей (значения от 0 до 1); -
labels- метки для интервалов (массив или False); -
retbins- если True, возвращает также границы интервалов; -
duplicates- управление обработкой дублирующихся границ.
Пример
Разобьём числовые данные на три интервала равной частоты:
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
res = pd.qcut(ser, q=3)
print(res)
Результат выполнения кода:
0 (0.999, 3.667]
1 (0.999, 3.667]
2 (0.999, 3.667]
3 (3.667, 6.333]
4 (3.667, 6.333]
5 (3.667, 6.333]
6 (6.333, 9.0]
7 (6.333, 9.0]
8 (6.333, 9.0]
dtype: category
Categories (3, interval[float64, right]): [(0.999, 3.667] < (3.667, 6.333] < (6.333, 9.0]]
Пример
Получим метки категорий вместо интервалов. Для этого передадим
список названий в параметр labels:
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
res = pd.qcut(ser, q=3, labels=['low', 'middle', 'high'])
print(res)
Результат выполнения кода:
0 low
1 low
2 low
3 middle
4 middle
5 middle
6 high
7 high
8 high
dtype: category
Categories (3, object): ['low' < 'middle' < 'high']
Пример
Разобьём данные по заданным квантилям. Укажем границы в виде списка значений от 0 до 1:
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
res = pd.qcut(ser, q=[0, 0.25, 0.5, 0.75, 1.0])
print(res)
Результат выполнения кода:
0 (0.999, 3.0]
1 (0.999, 3.0]
2 (3.0, 5.0]
3 (3.0, 5.0]
4 (5.0, 7.0]
5 (5.0, 7.0]
6 (7.0, 9.0]
7 (7.0, 9.0]
8 (7.0, 9.0]
dtype: category
Categories (4, interval[float64, right]): [(0.999, 3.0] < (3.0, 5.0] < (5.0, 7.0] < (7.0, 9.0]]
Пример
Вернём не только категории, но и границы интервалов.
Для этого установим retbins в значение True:
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
categories, bins = pd.qcut(ser, q=3, retbins=True)
print("Categories:")
print(categories)
print("\nBin edges:")
print(bins)
Результат выполнения кода:
Categories:
0 (0.999, 3.667]
1 (0.999, 3.667]
2 (0.999, 3.667]
3 (3.667, 6.333]
4 (3.667, 6.333]
5 (3.667, 6.333]
6 (6.333, 9.0]
7 (6.333, 9.0]
8 (6.333, 9.0]
dtype: category
Categories (3, interval[float64, right]): [(0.999, 3.667] < (3.667, 6.333] < (6.333, 9.0]]
Bin edges:
[0.999 3.667 6.333 9. ]
Пример
Применим qcut к столбцу таблицы DataFrame.
Создадим новый столбец с категориями:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [10, 20, 30, 40, 50]
})
df['a_cat'] = pd.qcut(df['a'], q=2, labels=['low', 'high'])
print(df)
Результат выполнения кода:
a b a_cat
0 1 10 low
1 2 20 low
2 3 30 low
3 4 40 high
4 5 50 high
Смотрите также
-
функция
cut,
которая разбивает данные на интервалы равной ширины -
функция
pivot_table,
которая создаёт сводную таблицу с группировкой -
функция
crosstab,
которая строит таблицу сопряжённости -
функция
get_dummies,
которая создаёт фиктивные переменные для категорий