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
df['q'] = pd.qcut(df['amount'], q=2, labels=False)
Результат:
amount q 100 0 250 0 900 1 1500 1
codes, bins = pd.qcut(df['amount'], q=4, retbins=True)
print(bins)
Результат:
[ 100. 212.5 575. 1050. 1500. ]Порешать Python-задачи в тренажёре →
Спрашивают при обсуждении RFM-сегментации и разбиения на топ-бакеты; идёт в паре с groupby для агрегации по корзинам и с pd.cut, чтобы показать разницу «равное число наблюдений» vs «равная ширина интервала».
qcut режет по квантилям — в каждой корзине примерно равное число наблюдений. cut режет по границам значений — интервалы равной ширины, но наполненность разная. Для RFM и сегментации по объёму берут qcut, для гистограмм с фиксированным шагом — cut.
Если в данных много повторов (например, куча нулей), границы соседних квантилей совпадают и становятся неуникальными. Передай duplicates='drop' — одинаковые границы схлопнутся, но реальных корзин получится меньше, чем q. Проверяй итоговое число категорий.
Передай labels=False — вернутся целочисленные индексы от 0 до q-1. Либо задай явные метки списком labels=['D','C','B','A']. С retbins=True дополнительно получишь массив границ квантилей.
Pandas groupby · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →