Функция Pandas pd.qcut()

Pandas 通用函数Pandas: общие функции


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 pandas as pd
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

Пояснение к коду:

  1. Для экспоненциально распределенных данных, если используется разбиение на интервалы равной ширины, большинство данных сосредоточится в одном интервале.
  2. pd.qcut()Это гарантирует, что каждый интервал содержит примерно одинаковое количество наблюдений (здесь 5, ровно 20/4).
  3. Точки квантилей рассчитываются на основе фактического распределения данных, а не делятся равномерно.

Пример 2: Указание пользовательских квантилей

С помощьюqпараметр, можно задавать произвольные квантили, такие как децили, процентили и т. д.

Пример

import pandas as pd
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 pandas as pd
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 常用函数Pandas: общие функции

Другие расширения