Функция Pandas pd.cut()
pd.cut()— используемая в библиотеке Pandas дляразбиения непрерывных данных (Binning)функция. Она делит числовые данные на дискретные категории согласно заданным интервалам и очень подходит для групповой статистики и визуализации в анализе данных.
Операции разбиения на интервалы очень распространены в анализе данных, например разделение возраста на «подросток», «средний возраст», «пожилой» или разделение баллов на «неудовлетворительно», «удовлетворительно», «хорошо», «отлично» и т. д.
Значение слова: cutЭто означает «cut». Здесь имеется в виду «разрезание» непрерывного интервала данных на несколько дискретных интервалов.
Базовый синтаксис и параметры
pd.cut()— это функция верхнего уровня библиотеки Pandas, используемая для дискретизации непрерывных переменных.
Формат синтаксиса
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
Описание параметра
- Параметр:
x- Тип: объект, подобный массиву, например list, Series, array и т. д.
- Описание: непрерывные числовые данные, подлежащие разбиению на интервалы.
- Параметр:
bins- Тип: целое число, скаляр (границы интервалов) или IntervalIndex.
- Описание: метод разбиения. Это может быть целое число (указывающее, на сколько интервалов равной ширины разбить) или список (задающий конкретные границы интервалов).
- Параметр:
right- Тип: логическое значение.
- Описание: использовать ли интервалы, замкнутые справа. По умолчанию
True(т. е. в форме [a, b]). Если установлено значениеFalse, то это левозамкнутый правооткрытый интервал (a, b].
- Параметр:
labels- Тип: Array или None.
- Описание: задать пользовательские метки для каждого интервала. Если не указано, используются представления интервалов, такие как "(0, 10]".
- Параметр:
retbins- Тип: логическое значение.
- Описание: Если
True, результат будет содержать границы интервалов. По умолчаниюFalse。
- Параметр:
include_lowest- Тип: логическое значение.
- Описание: Если
True, первый интервал содержит левую границу. По умолчаниюFalse。
Описание функций
- Возвращаемое значение: Возвращает Series типа Categorical, где каждое значение соответствует интервалу, к которому оно принадлежит.
- Эффект: Отображает непрерывные числовые значения в дискретные категории (интервалы).
Пример
Давайте подробно разберём на серии примеров от простого к сложному,pd.cut()использование.
Пример 1: Базовое использование — разбиение на интервалы равной ширины
Пример
import numpy as np
# 1. Создание числовых данных
scores = pd.Series([55, 70, 82, 45, 90, 65, 78, 88, 92, 58])
print("=== Исходные баллы ===")
print(scores)
# 2. Разделите баллы на 3 интервала равной ширины
result = pd.cut(scores, bins=3)
print("\n=== pd.cut(scores, bins=3) разбиение на интервалы равной ширины ===)
print(result)
# 3. Просмотр границ интервалов
result_bins = pd.cut(scores, bins=3, retbins=True)
print("\n=== Возвращаемые границы интервалов ===)
print(f"Границы интервалов: {result_bins)
Ожидаемый вывод:
=== 原始分数 === 0 55 1 70 2 82 3 45 4 90 5 65 6 78 7 88 8 92 9 58 === pd.cut(scores, bins=3) 等宽分箱 === 0 (44.667, 60.667] 1 (60.667, 76.333] 2 (76.333, 92.0] 3 (44.667, 60.667] 4 (76.333, 92.0] 5 (60.667, 76.333] 6 (60.667, 76.333] 7 (76.333, 92.0] 8 (76.333, 92.0] 9 (44.667, 60.667] dtype: category Categories (3, interval[float64]): [(44.667, 60.667] < (60.667, 76.333] < (76.333, 92.0] === 返回分箱边界 === 分箱边界: [44.667 60.667 76.333 92. ]
Пояснение к коду:
bins=3Указывает, что данные автоматически разбиваются на 3 интервала равной ширины.- Pandas автоматически вычисляет границы интервалов на основе минимального и максимального значений данных.
- Возвращаемое значение имеет тип Categorical, а каждое значение является объектом Interval.
- По умолчанию используются правосторонне замкнутые интервалы, т. е. в форме (a, b].
Пример 2: Пользовательские границы интервалов
В практических приложениях нам часто нужно настраивать границы интервалов в соответствии с бизнес-требованиями.
Пример
import numpy as np
# Создание данных оценок
scores = pd.Series([55, 70, 82, 45, 90, 65, 78, 88, 92, 58, 73, 67, 81, 49, 95])
# Пользовательские границы интервалов: Fail, Pass, Good, Excellent
bins = [0, 60, 75, 90, 100]
labels = ['Fail', 'Pass', 'Good', 'Отличное']
result = pd.cut(scores, bins=bins, labels=labels, include_lowest=True)
print("=== Исходные баллы ===")
print(scores.values)
print("\n=== Результат разбиения по интервалам ===)
print(result)
# Подсчитать количество человек в каждой оценке
print("\n=== Статистика распределения оценок ===)
print(result.value_counts().sort_index())
Ожидаемый вывод:
=== 原始成绩 [55 70 82 45 90 65 78 88 92 58 73 67 81 49 95] === 分箱结果 0 及格 1 良好 2 良好 3 不及格 4 优秀 ... 12 良好 13 不及格 14 优秀 dtype: category Categories (4, interval[int64]): [不及格 < 及格 < 良好 < 优秀] === 成绩分布统计 不及格 3 及格 4 良好 5 优秀 3 dtype: int64
Пояснение к коду:
bins=[0, 60, 75, 90, 100]Определено 4 интервала: [0-60], (60-75], (75-90], (90-100]labelsПараметр labels задаёт интуитивно понятные китайские метки для каждого интервалаinclude_lowest=TrueУбедитесь, что первый интервал содержит левую границу 0value_counts()Позволяет легко подсчитать количество человек в каждой оценке
Пример 3: Использование интервалов, замкнутых справа/слева
Пример
import numpy as np
# Тестовые данные
data = pd.Series([10, 20, 30, 40, 50])
# По умолчанию интервал замкнут справа [a, b]
result1 = pd.cut(data, bins=4)
print("=== Интервал по умолчанию, замкнутый справа [a, b] ===")
print(result1)
# Интервал, замкнутый слева и открытый справа (a, b]
result2 = pd.cut(data, bins=4, right=False)
print("\n=== Интервал, замкнутый слева и открытый справа (a, b] ===)
print(result2)
Ожидаемый вывод:
=== 默认右闭区间 [a, b] 0 (7.5, 17.5] 1 (17.5, 27.5] 2 (27.5, 37.5] 3 (37.5, 47.5] 4 (47.5, 57.5] dtype: category === 左闭右开区间 (a, b] 0 [10, 17.5) 1 [17.5, 27.5) 2 [27.5, 37.5) 3 [37.5, 47.5) 4 [47.5, 57.5) dtype: category
Пояснение к коду:
- По умолчанию используется интервал, замкнутый справа
[a, b], т. е. включает правую границу - Set
right=Falseчтобы перейти к интервалу, замкнутому слева и открытому справа[a, b) - Режим открытости/замкнутости интервала влияет на классификацию граничных значений.
Примечания
Важные замечания:
- Если в данных есть значения, которые превышают
binsзаданный диапазон, будет сгенерировано NaNNaNbinsграницы должны быть монотонно возрастающими- При использовании пользовательских меток количество меток должно быть на единицу меньше количества границ.
- Результат разбиения на интервалы имеет тип Categorical и может обрабатываться с помощью строковых методов.
Другие расширения
Pandas: общие функции