如何使用 Pandas cut() 和 qcut()?


Pandas 是一个用于结构化数据操作和分析的 Python 库。Pandas 的 cut() 和 qcut() 方法用于根据数值数据创建分类变量。cut() 和 qcut() 方法分别将数值数据分割成离散的区间或分位数,并为每个区间或分位数分配标签。在本文中,我们将通过各种示例来了解 cut() 和 qcut() 方法的功能。

cut() 函数

cut() 函数根据指定的标准将连续变量划分为离散的箱或区间。它根据输入数据中存在的数值范围创建数据组或类别。

语法

pandas.cut(x, bins, labels=None, right=True, include_lowest=False, ...)

上面语法中使用的参数是:

  • x: 输入数据,可以是 Pandas Series 或 NumPy 数组。

  • bins: 可以是指定要创建的等宽箱数的整数,或者是一系列标量值,用于定义箱的边缘。如果提供整数,则 x 中的值范围将被划分为这么多等宽的箱。

  • labels (可选): 要分配给每个箱的标签的类似数组的对象。如果未提供,则标签将是指示箱索引的整数。

  • right (可选): 一个布尔值,指示区间应为右闭合(包含右箱边缘)还是左闭合(包含左箱边缘)。默认设置为 True。

  • include_lowest (可选): 一个布尔值,指示是否包含区间的最低值。默认设置为 False。

示例 1:等宽箱

在下面的示例中,我们有一系列数值数据。我们将 bins 指定为 3,表示我们想将数据划分为三个等宽的箱。输出显示每个值所属的区间以及相应的类别。

import pandas as pd

# Example 1: Equal-width bins
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
bins = 3
categories = pd.cut(data, bins)
print(categories)

输出

[(9.91, 40.0], (9.91, 40.0], (9.91, 40.0], (9.91, 40.0], (40.0, 70.0], (40.0, 70.0], (40.0, 70.0], (70.0, 100.0], (70.0, 100.0], (70.0, 100.0]]
Categories (3, interval[float64, right]): [(9.91, 40.0] < (40.0, 70.0] < (70.0, 100.0]]

示例 2:自定义箱边缘和标签

在下面的示例中,我们定义自定义箱边缘 [0, 30, 60, 100] 和相应的标签 ['低', '中', '高']。cut() 函数根据提供的箱和标签将数据中的每个值分配到相应的类别。

# Example 2: Custom bin edges and labels
import pandas as pd
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
bins = [0, 30, 60, 100]
labels = ['Low', 'Medium', 'High']
categories = pd.cut(data, bins, labels=labels)
print(categories)

输出

['Low', 'Low', 'Low', 'Medium', 'Medium', 'Medium', 'High', 'High', 'High', 'High']
Categories (3, object): ['Low' < 'Medium' < 'High']

qcut() 函数

与 cut() 函数将数据分成等宽区间不同,qcut() 函数根据分位数或百分位数划分数据。每个箱中数据点的数量相等,这使得它对于创建均匀分布的组非常有用。

语法

pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

语法中使用的参数是:

  • x: 输入数据,可以是 Pandas Series 或 NumPy 数组。

  • q: 指定要创建的分位数个数的整数,或一系列分位数(0 到 1 之间的值),用于定义截止点。

  • labels (可选): 要分配给每个箱的标签的类似数组的对象。如果未提供,则标签将是指示箱索引的整数。

  • retbins (可选): 一个布尔值,指示是否与类别一起返回箱边缘。默认设置为 False。

  • precision (可选): 指定分位数精度值的整数。默认设置为 3。

  • duplicates (可选): 如何处理重复值。默认设置为 'raise',这将引发错误。

示例 1:相同数量的分位数

在下面的示例中,我们与之前一样拥有数值数据。通过将分位数指定为 3,我们将数据划分为三个大小相等的分位数。输出显示每个值所属的区间以及相应的类别。

import pandas as pd

# Example 1: Equal number of quantiles
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
quantiles = 3
categories = pd.qcut(data, quantiles)
print(categories)

输出

[(9.999, 40.0], (9.999, 40.0], (9.999, 40.0], (9.999, 40.0], (40.0, 70.0], (40.0, 70.0], (40.0, 70.0], (70.0, 100.0], (70.0, 100.0], (70.0, 100.0]]
Categories (3, interval[float64, right]): [(9.999, 40.0] < (40.0, 70.0] < (70.0, 100.0]]

示例 2:自定义分位数和标签

在下面的示例中,我们定义自定义分位数 [0, 0.3, 0.6, 1] 和相应的标签 ['低', '中', '高']。qcut() 函数根据提供的分位数和标签将每个值分配到相应的类别。

import pandas as pd

# Example 2: Custom quantiles and labels
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
quantiles = [0, 0.3, 0.6, 1]
labels = ['Low', 'Medium', 'High']
categories = pd.qcut(data, quantiles, labels=labels)
print(categories)

输出

['Low', 'Low', 'Low', 'Medium', 'Medium', 'Medium', 'High', 'High', 'High', 'High']
Categories (3, object): ['Low' < 'Medium' < 'High']

结论

在本文中,我们讨论了如何使用 pandas cut() 和 qcut() 方法根据数值数据创建分类变量。cut() 函数根据给定条件将数据划分为离散区间,而 qcut() 方法将数据划分为分位数或百分位数。这两个函数还可以为每个区间或分位数分配标签,这有助于将数值数据转换为分类数据。

更新于:2023年10月13日

909 次查看

启动您的职业生涯

完成课程获得认证

开始学习
广告