当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Pandas cut方法用法及代码示例


Pandas cut(~) 方法将数值分类为箱(区间)。

参数

1. x | array-like

一个一维输入数组,其数值将被分段到容器中。

2. bins | intsequence<scalar> IntervalIndex

bins 的指定类型决定了 bin 的计算方式:

类型

说明

int

equal-width bin 的数量。 x 的范围增加 0.1%,以确保所有值都落入某个 bin 中。

sequence<scalar>

所需的 bin 边。不属于 bin 的值将设置为 NaN

IntervalIndex

要使用的确切箱子。

3. right | boolean | optional

是否排除左 bin 边并包含右 bin 边。默认情况下,right=True

4. labels | arrayFalse | optional

所需的箱子标签。默认情况下,labels=None

5. retbins | boolean | optional

是否返回箱子。默认情况下,retbins=False

6. precision | int | optional

容器标签中包含的小数位数。默认情况下,precision=3

7. include_lowest | boolean | optional

是否包含第一个 bin 的左边。默认情况下,include_lowest=False

8. duplicates | string | optional

如何处理重复的 bin 边:

说明

"raise"

如果设置了任何重复的 bin 边,则会抛出错误。

"drop"

删除重复的箱子边并只保留一个。

默认情况下,duplicates="raise"

9. ordered | boolean | optional | v1.10~

是否嵌入排序信息。仅当返回类型为数据类型 CategoricalCategoricalSeries 时,这才相关。如果提供了labels,则ordered 只能设置为False。默认情况下,ordered=True

返回值

返回类型取决于labels参数的类型:

  • 如果labels未指定:

    • 如果 xSeries ,则返回对每个值的 bin 进行编码的 Series 。每个 bin 间隔由 Interval 表示。

    • 否则,返回Categorical。每个 bin 间隔由 Interval 表示。

  • 如果 labels 是标量数组:

    • 如果 xSeries ,则返回 SeriesSeries 中存储的值的类型与 labels 中存储的值的类型匹配。

    • 否则,返回CategoricalCategorical 中存储的值的类型与 labels 中存储的值的类型匹配。

  • 如果 labels 是布尔值 False ,则返回一个 Numpy 整数数组。

如果 retbins=True ,则除了上述内容之外,容器还将作为 Numpy 数组返回。如果 x IntervalIndex ,则返回 x

例子

考虑以下有关学生及其成绩的DataFrame:

raw_grades = [3,6,8,7,4,6]
students = ["alex", "bob", "cathy", "doge", "eric", "fred"]
df = pd.DataFrame({"name":students,"raw_grade":raw_grades})
df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

基本用法

将原始等级分为四个箱(段):

df["grade"] = pd.cut(df["raw_grade"], bins=4)   # returns a Series
df



   name  raw_grade    grade
0  alex     3       (2.999, 4.5]
1  bob      6       (4.5, 6.0]
2  cathy    8       (6.75, 8.0]
3  doge     7       (6.75, 8.0]
4  eric     4       (2.999, 4.5]
5  fred     6       (4.5, 6.0]

grade 列现在包含 bin,总共应该有 4 不同的 bin。请注意, (2.995, 4.25] 仅表示 2.995 < raw_grade <= 4.25

指定自定义 bin 边

要指定自定义 bin 边,我们可以传入 bin 边数组而不是 int

df["grade"] = pd.cut(df["raw_grade"], bins=[0,4,6,10])
df



   name  raw_grade  grade
0  alex     3       (0, 4]
1  bob      6       (4, 6]
2  cathy    8       (6, 10]
3  doge     7       (6, 10]
4  eric     4       (0, 4]
5  fred     6       (4, 6]

我们在这里展示相同的df供您参考:

df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

指定权利

要使左 bin 边包含在内且右 bin 边不包含,请设置 right=False

df["grade"] = pd.cut(df["raw_grade"], bins=[0,4,6,10], right=False)
df



   name  raw_grade  grade
0  alex      3      [0, 4)
1  bob       6      [6, 10)
2  cathy     8      [6, 10)
3  doge      7      [6, 10)
4  eric      4      [4, 6)
5  fred      6      [6, 10)

请注意我们如何使用 [0, 4) 而不是默认的 (0, 4]

指定标签

我们可以通过设置labels参数来为我们的箱子添加标签:

df["grade"] = pd.cut(df["raw_grade"], bins=3, labels=["C","B","A"])
df



   name  raw_grade  grade
0  alex      3        C
1  bob       6        B
2  cathy     8        A
3  doge      7        A
4  eric      4        C
5  fred      6        B

这是cut(~) 方法的一个非常实用的函数。 labels 数组的长度必须等于指定的 bin 数量。

通过设置 labels=False ,返回 int 的 Numpy 数组:

raw_grades = [3,6,8,7,4,5]
pd.cut(raw_grades, bins=3, labels=False)



array([0, 1, 2, 2, 0, 1])

在这里,输出告诉我们:

  • 原始等级 3 属于 bin 0(第一个 bin)。

  • 原始等级 6 属于 bin 1(第二个 bin)。

  • 等等。

指定 retbins

要获得计算的 bin 边,请设置 retbins=True

raw_grades = [3,6,8,7,4,5]
res = pd.cut(raw_grades, bins=2, retbins=True)
print("Categories: ", res[0])
print("Bin egdes: ", res[1])



Categories:  [(2.995, 5.5], (5.5, 8.0], (5.5, 8.0], (5.5, 8.0], (2.995, 5.5], (2.995, 5.5]]
Categories (2, interval[float64]): [(2.995, 5.5] < (5.5, 8.0]]
Bin egdes:  [2.995 5.5   8.   ]

我们在这里展示相同的df供您参考:

df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

指定精度

要控制显示多少位小数,请设置precision参数:

res = pd.cut(df["raw_grade"], bins=[0,4.33333,6.6,10], precision=2)
print(res)



0    (0.0, 4.33]
1    (4.33, 6.6]
2    (6.6, 10.0]
3    (6.6, 10.0]
4    (0.0, 4.33]
5    (4.33, 6.6]
Name: raw_grade, dtype: category
Categories (3, interval[float64]): [(0.0, 4.33] < (4.33, 6.6] < (6.6, 10.0]]

在这里,请注意 4.3333 如何被截断为 4.33 ,如 2precision 值所指定。

指定include_lowest

考虑以下:

df["grade"] = pd.cut(df["raw_grade"], bins=[3,6,10])
df



   name  raw_grade     grade
0  alex      3          NaN
1  bob       6       (3.0, 6.0]
2  ...

默认情况下, include_lowest=False ,这意味着第一个 bin 间隔是 left-exclusive。这就是为什么 3 的 raw_grade 不属于这里的任何 bin 的原因。

我们可以通过设置 include_lowest=True 来设置第一个 bin 间隔 left-inclusive :

df["grade"] = pd.cut(df["raw_grade"], bins=[3,6,10], include_lowest=True)
df



   name  raw_grade       grade
0  alex      3        (2.999, 6.0]
1  bob       6        (2.999, 6.0]
...

我们现在看到 3raw_grade 已包含在第一个 bin 中。

指定重复项

默认情况下,bin 边必须是唯一的,否则将引发错误。例如:

x = [3,7,8,7,4,5]
pd.cut(x, bins=[2,6,6,10])   # duplicates="raise"



ValueError: Bin edges must be unique: array([ 2,  6,  6, 10]).

在这里,我们有两个值 6 的 bin 边,因此这就是我们收到错误的原因。

为了删除(删除)多余的 bin 边,请设置 duplicates="drop" ,如下所示:

x = [3,7,8,7,4,5]
pd.cut(x, bins=[2,6,6,10], duplicates="drop")



[(2, 6], (6, 10], (6, 10], (6, 10], (2, 6], (2, 6]]
Categories (2, interval[int64]): [(2, 6] < (6, 10]]

我们看到值 6 的 bin 边之一被丢弃。

指定有序

默认情况下, ordered=True ,这意味着生成的 Categorical 将被排序:

grades = [3,6,8,7,4,5]
pd.cut(grades, bins=2, labels=["B","A"])   # ordered=True



['B', 'A', 'A', 'A', 'B', 'B']
Categories (2, object): ['B' < 'A']

请注意有关排序的信息如何嵌入为 ['B'<'A']

通过设置 ordered=False ,可以省略此类排序信息:

grades = [3,6,8,7,4,5]
pd.cut(grades, bins=2, labels=["B","A"], ordered=False)



['B', 'A', 'A', 'A', 'B', 'B']
Categories (2, object): ['B', 'A']

要设置 ordered=False ,请确保已指定 labels

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Pandas | cut method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。