Pandas Cut–从连续到分类

  • Post category:Python

Pandas是一个Python编程语言的数据分析库,它帮助我们处理数据方便,可靠而快速。Pandas库中有一个cut函数,该函数用于将一个连续的数组划分成具有相同数量的元素的离散集合。当您尝试将连续数据转换为分类数据时,可用此函数。在本文中,我们将讨论Pandas Cut函数及其用法。

Pandas Cut函数

Pandas Cut是pandas中用于将连续变量转换为分类变量的函数。假设我们有一个连续数组或序列,我们希望将其划分为几个区间组,这些区间组可以表示为不同分类,即分类数据。Cut函数可以帮助我们达到这个目标。

例如,如果我们有一组年龄数据,我们可以通过将其分为小孩,青年人,成人和老年人来将其转换为分类数据。Cut函数接收以下参数:

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
  • x: 需要划分为区间组的连续型数据
  • bins: 分类边界值。它可以指定分隔范围或分隔点。如果是一个整数,它表示将x分成多少个相同的间隔。如果是序列,则它代表给定的分隔点
  • right:表示是否包含右边界,默认为True,即包含右边界。设置为False,则不包含右边界,用于搜索左开右闭间隔
  • labels:我们可以通过指定列表来指定每个区间组的标签
  • retbins:它为True时返回每个bin的数据。默认False
  • precision:表示小数点后保留几位小数
  • include_lowest:是否包含最低的区间结果。默认为False,不包含
  • duplicates:表示不允许重复

一个简单的例子

我们先看一个例子:

import pandas as pd
import numpy as np

# 创建一组数据
age = pd.DataFrame({
    'age': np.random.randint(0, 100, 20)
})

print(age.head())

创建出来的age数据可能是这样的:

   age
0   43
1   14
2   89
3   87
4   40

接下来,我们尝试用cut函数将数据分成三个组:

age['age_group'] = pd.cut(age['age'], bins=3)
print(age.head())

输出结果为:

   age       age_group
0   43  (28.333, 57.0]
1   14  (-0.099, 28.333]
2   89    (57.0, 85.667]
3   87    (57.0, 85.667]
4   40  (28.333, 57.0]

我们可以看到,cut函数已经成功将数据分成三个组,每个组的数据区间差不多相等。age_group列代表每个组,它是每个间隔组的标签。

各种参数的使用

指定具体的分类边界值

除了指定需要分组的数量之外,还可以通过给出精确的分隔点以进行分类。

例如,让我们将上面的示例中的数据分为以下三个区间组:0-18岁、18-50岁和50岁以上。我们需要指定分类边界值来实现这一点。

age['age_group'] = pd.cut(age['age'], bins=[0, 18, 50, 100])
print(age.head())

这样我们将得到以下结果:

   age      age_group
0   43    (18, 50]
1   14      (0, 18]
2   89  (50, 100]
3   87  (50, 100]
4   40    (18, 50]

自定义标签

在上面的示例中,我们只是默认标签,标签只有区间左边界的数字, 这可能对用户并不友好。Pandas Cut函数允许我们更改这些标签。

例如:

age['age_group'] = pd.cut(age['age'], bins=[0, 18, 50, 100], labels=['under 18', '18-50', 'over 50'])
print(age.head())

这个例子指定的标签更直观,可以很容易地理解:

   age age_group
0   43     18-50
1   14  under 18
2   89   over 50
3   87   over 50
4   40     18-50

排除最高或最低区间

我们可以指定参数include_lowest=Falseright=Falseleft=False来控制保留或排除最高或最低区间。

例如,以下示例将bins=[0, 18, 50, 100]中的最低区间排除在外,标签将从”0至18岁”开始:

age['age_group'] = pd.cut(age['age'], bins=[0, 18, 50, 100], labels=['0-18', '18-50', '50+'], include_lowest=False)
print(age.head())

您将看到以下输出:

   age age_group
0   43     18-50
1   14      0-18
2   89       50+
3   87       50+
4   40     18-50

注意:include_lowest=False将从0开始,但是如果我们将参数include_lowest=True,则会有两个区间从”-0.1″开始,因为这是一个闭合区间,无法使用负数,因此它采用了一个小于0的数字。

组数量不一致

如果我们有两个数据范围完全不一致的连续数据集,并且需要将它们转换为相同数量的区间组,则可以使用qcut而不是cut函数。例如,如果我们有两个数据集,一个是0-1之间的,另一个是0-100之间的,我们将两个数据集分成相同数量的区间组,则需要使用qcut函数而不是cut函数。

例如:

import pandas as pd
import numpy as np

#创建一组数据
data = pd.DataFrame({
    'x': np.append(np.random.normal(loc=2, size=80), np.random.normal(loc=5, size=20))
})

#通过qcut将数据分成4个相等的区间组
data['x_group'] = pd.qcut(data['x'], q=4)
print(data.head())

输出结果为:

          x           x_group
0  1.928358  (1.033, 2.871]
1  2.742201  (2.871, 3.694]
2  3.417835  (2.871, 3.694]
3  2.048446  (1.033, 2.871]
4  2.418745  (1.033, 2.871]

总结

Cut函数是将连续型数据转换为分类数据的重要函数,它可以用于将年龄、长度、重量等数据分类。我们可以通过指定分类边界、标签等参数来定制化分类数据。Pandas Cut函数可以非常方便地将连续型数据转换为分类数据,特别是在机器学习和数据分析等领域发挥了重要作用。