Функция pd.qcut() в pandas: разбиение на квантильные корзины равной наполненности

pd.qcut() делит числовой ряд на корзины с примерно равным числом наблюдений — это квантили: квартили (q=4), квинтили (q=5), децили (q=10). Аналитику это нужно, чтобы бить пользователей на равные по размеру сегменты (RFM, топ-20% по выручке) без ручного подбора порогов. Прямого аналога-функции в SQL нет — там это делают оконной NTILE(), что полезно помнить на собесе.

Синтаксис

pd.qcut(x, q, labels=None, retbins=False, duplicates='raise')

Примеры использования

Пример 1: Квартили с метками (RFM-тиры)

import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2, 3, 4],
    'amount': [100, 250, 900, 1500],
})
df['tier'] = pd.qcut(df['amount'], q=4, labels=['D', 'C', 'B', 'A'])

Результат:

user_id  amount tier
      1     100    D
      2     250    C
      3     900    B
      4    1500    A

Пример 2: Номера корзин вместо интервалов

df['q'] = pd.qcut(df['amount'], q=2, labels=False)

Результат:

amount  q
   100  0
   250  0
   900  1
  1500  1

Пример 3: Посмотреть границы корзин

codes, bins = pd.qcut(df['amount'], q=4, retbins=True)
print(bins)

Результат:

[ 100.   212.5  575.  1050.  1500. ]
Порешать Python-задачи в тренажёре →

Типичная ошибка

Если в данных много одинаковых значений, границы квантилей совпадают и qcut падает с 'Bin edges must be unique' — спасает duplicates='drop' (но корзин станет меньше q). NaN исключаются из расчёта границ и остаются NaN в результате. Число меток в labels должно совпадать с количеством корзин.

Где спрашивают на собеседовании

Спрашивают при обсуждении RFM-сегментации и разбиения на топ-бакеты; идёт в паре с groupby для агрегации по корзинам и с pd.cut, чтобы показать разницу «равное число наблюдений» vs «равная ширина интервала».

FAQ: частые вопросы про qcut

Чем pd.qcut отличается от pd.cut?

qcut режет по квантилям — в каждой корзине примерно равное число наблюдений. cut режет по границам значений — интервалы равной ширины, но наполненность разная. Для RFM и сегментации по объёму берут qcut, для гистограмм с фиксированным шагом — cut.

Почему qcut падает с ошибкой 'Bin edges must be unique'?

Если в данных много повторов (например, куча нулей), границы соседних квантилей совпадают и становятся неуникальными. Передай duplicates='drop' — одинаковые границы схлопнутся, но реальных корзин получится меньше, чем q. Проверяй итоговое число категорий.

Как получить номера корзин, а не интервалы?

Передай labels=False — вернутся целочисленные индексы от 0 до q-1. Либо задай явные метки списком labels=['D','C','B','A']. С retbins=True дополнительно получишь массив границ квантилей.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas groupby · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →