Функция Pandas pd.qcut()
pd.qcut()— это функция в библиотеке Pandas, используемая дляразбиения по квантилям. Она делит данные на равное количество выборок, при этом каждый интервал содержит примерно одинаковое число точек данных.
иpd.cut()В отличие от (разбиения на интервалы равной ширины),pd.qcut()он гарантирует, что каждый интервал содержит одинаковое количество данных, что делает его очень подходящим для обработки асимметричных распределений или случаев, когда данные нужно разделить в соответствии с их естественными квантилями.
Значения слов: qcutВ нем "q" обозначает "квантиль" (количество делений), что означает "разрезать" данные по квантилям.
Базовый синтаксис и параметры
pd.qcut()Это функция верхнего уровня библиотеки Pandas, используемая для дискретизации на основе квантилей.
Формат синтаксиса
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
Описание параметра
- Параметр:
x- Тип: объект, подобный массиву, например список, Series, массив и т. д.
- Описание: непрерывные числовые данные, подлежащие разбиению на интервалы.
- Параметр:
q- Тип: целое число или массив квантилей.
- Описание: количество интервалов или конкретные квантили. Если это целое число n, это означает разбиение данных на n групп равного размера (каждая группа содержит примерно 1/n данных). Это также может быть массив квантилей (например, [0, 0.25, 0.5, 0.75, 1.0]).
- Параметр:
labels- Тип: Array или None.
- Описание: указать пользовательские метки для каждого интервала. Если не указано, используется квантильная нотация (например, "(0, 25]").
- Параметр:
retbins- Тип: логическое значение.
- Описание: Если
True, возвращаемый результат включает значения границ интервалов. По умолчанию —False。
- Параметр:
duplicates- Type: String ('raise' or 'drop').
- Description: If the bin edges have duplicates (resulting in fewer intervals than the specified q value),
'raise'raises an exception,'drop'deletes duplicate edges. Default is'raise'。
Описание функций
- Возвращаемое значение: Возвращает Series типа Categorical, каждое значение соответствует своей группе квантилей.
- Эффект: Отображает непрерывные значения в дискретные категории по квантилям, каждая категория содержит примерно одинаковое количество наблюдений.
Примеры
Давайте досконально освоим с помощью серии примеров от простых к сложнымpd.qcut()использование.
Пример 1: Базовое использование - разбиение по квартилям
Пример
import numpy as np
# 1. Создайте асимметричные числовые данные (большинство значений малы)
np.random.seed(42)
data = np.random.exponential(scale=2, size=100) # Данные экспоненциального распределения
# Возьмите подмножество данных для удобства чтения
scores = pd.Series(data[:20])
print("=== Исходные данные ===")
print(scores.sort_values().values)
# 2. Используйте pd.qcut() для разделения данных на 4 группы квантилей (квартили)
result = pd.qcut(scores, q=4)
print("\n=== pd.qcut(scores, q=4) разбиение по квартилям ===)
print(result.value_counts().sort_index())
Ожидаемый вывод:
=== 原始数据 === [ 0.078 0.29 0.68 0.91 1.03 1.06 1.23 1.3 1.5 1.69 1.86 2.01 2.12 2.3 2.32 2.42 3.03 3.39 5.29 7.39] === pd.qcut(scores, q=4) 四分位分箱 === (0.0783, 1.547] 5 (1.547, 2.315] 5 (2.315, 3.151] 5 (3.151, 7.393] 5 dtype: int64
Пояснение к коду:
- Для экспоненциально распределенных данных, если используется разбиение на интервалы равной ширины, большинство данных сосредоточится в одном интервале.
pd.qcut()Это гарантирует, что каждый интервал содержит примерно одинаковое количество наблюдений (здесь 5, ровно 20/4).- Точки квантилей рассчитываются на основе фактического распределения данных, а не делятся равномерно.
Пример 2: Указание пользовательских квантилей
С помощьюqпараметр, можно задавать произвольные квантили, такие как децили, процентили и т. д.
Пример
import numpy as np
# 1. Создание данных
df = pd.DataFrame({
'name': ['Student_' + str(i) for i in range(1, 11)],
'score': [65, 78, 82, 55, 90, 72, 68, 85, 45, 95]
})
print("=== Данные оценок студентов ===")
print(df)
# 2. Разбиение по пользовательским квантилям [0, 0.3, 0.7, 1.0], соответствующим 30%, 70%, 100%
result = pd.qcut(df['score'], q=[0, 0.3, 0.7, 1.0])
print("\n=== Разбиение по 30% и 70% квантилям ===)
print(result)
# 3. Добавление пользовательских меток
labels = ['Зачёт', 'Хорошо', 'Отлично']
result_labeled = pd.qcut(df['score'], q=3, labels=labels)
print("\n=== Добавлены пользовательские метки ===)
print(result_labeled)
Ожидаемый вывод:
=== 学生成绩数据 ===
name score
0 Student_1 65
1 Student_2 78
2 Student_3 82
3 Student_4 55
4 Student_5 90
5 Student_6 72
6 Student_7 68
7 Student_8 85
8 Student_9 45
9 Student_10 95
=== 按 30% 和 70% 分位数分箱 ===
0 (44.999, 65.8]
1 (65.8, 86.4]
2 (65.8, 86.4]
3 (44.999, 65.8]
4 (86.4, 95.0]
5 (65.8, 86. 86.4]
6 (0.0, 44.999]
7 (44.999, 65.8]
8 (0.0, 44.999]
9 (65.8, 86.4]
10 (65.8, 86.4]
Пояснение к коду:
q=[0, 0.3, 0.7, 1.0]Определены три интервала: 0-30% (низкие баллы), 30%-70% (средние) и 70%-100% (высокие баллы).- Используя
labelsпараметр, вы можете задать имя каждому интервалу вместо использования стандартной записи интервалов.
Пример 3: Сравнение cut и qcut
Благодаря сравнению вы сможете более ясно понятьcutиqcutразницу.
Пример
import numpy as np
# 1. Создайте асимметричные данные (большинство значений невелики)
data = pd.Series([1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 20, 30, 40, 50])
print("=== Исходные данные ===")
print(data.values)
# 2. Разбиение на интервалы равной ширины (pd.cut)
print("\n=== pd.cut разбиение на интервалы равной ширины ===)
cut_result = pd.cut(data, bins=4)
print(cut_result.value_counts().sort_index())
# 3. Равночастотное разбиение на интервалы (pd.qcut)
print("\n=== pd.qcut равночастотное разбиение ===)
qcut_result = pd.qcut(data, q=4)
print(qcut_result.value_counts().sort_index())
Ожидаемый вывод:
=== 原始数据 === [ 1 1 1 1 1 1 1 1 1 10 20 30 40 50] === pd.cut 等宽分箱 === (0.975, 13.25] 10 # 10 个值在这个区间 (13.25, 25.5] 1 (25.5, 37.75] 1 (37.75, 50.0] 2 # 2 个值在这个区间 dtype: 50 === pd.qcut 等量分箱 === (0.999, 7.75] 4 # 约 1/4 的数据 (7.75, 25.0] 4 (25.0, 42.5] 4 (10.0, 50.0] 4 # 约 1/4 的数据
Пояснение к коду:
pd.cut()Диапазон данных равномерно разделён на 4 части, но из-за сильной асимметрии данных большинство значений (девять единиц) попадают в первый интервал.pd.qcut()Это гарантирует, что каждый интервал содержит одинаковое количество точек данных (4), даже если ширины интервалов сильно различаются.
Другие расширенияСовет:
pd.cut()Подходит для случаев, когда распределение данных равномерно или требуются интервалы фиксированной ширины.pd.qcut()Подходит для случаев, когда распределение данных неравномерно или требуется разбиение по рангу/проценту.
Pandas: общие функции