如何使用 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() 方法将数据划分为分位数或百分位数。这两个函数还可以为每个区间或分位数分配标签,这有助于将数值数据转换为分类数据。