根据值对pandas数据框中的数据进行分类

2 投票
1 回答
3994 浏览
提问于 2025-04-17 22:44

我经常需要对一系列数字进行分类:

比如说:

|Num| cat|
| 2 |low |
| 7 | med|
| 10|high|

我想要的功能!我想建立两个函数。

函数 1 - 这个函数需要三个参数: 参数 1:数据框的名称 参数 2:数据框中的一列名称 参数 3:想要的分类数量,比如我想要(5)。

这个函数会根据我想要的5个分类来计算出最大值、最小值,并返回值的范围:比如说(1,2),(3,4),(5,6),(7,8),(9,10)。

我在想,可能可以用 (最大值 - 最小值) / 分类数量来计算,但最终会得出这些范围。

然后,函数 1 会返回这些范围:(1,2),(3,4),(5,6),(7,8),(9,10)。

函数 2 - 这个函数也需要三个参数: 参数 1:数据框的名称 参数 2:来自 pandas 数据框的一列名称(和函数 1 中的一样) 参数 3:你想在数据框中创建的新列的名称。 参数 4:来自函数 1 的一组范围。 参数 5:一个分类列表,比如 ['低','中','高'] 等等。

这个函数会在数据框中创建一个新列,并把分类放进去。

1 个回答

4

我觉得你在找的是 cut 这个功能:

In [11]: s = pd.Series(np.random.randint(1, 11, (10, )))

In [12]: s
Out[12]:
0     7
1    10
2     5
3     8
4     5
5     4
6     3
7     3
8     4
9     1
dtype: int64

In [13]: cat = pd.cut(s, [0, 9, 10])

In [14]: cat
Out[14]:
  (0, 9]
 (9, 10]
  (0, 9]
  (0, 9]
  (0, 9]
  (0, 9]
  (0, 9]
  (0, 9]
  (0, 9]
  (0, 9]
Levels (2): Index(['(0, 9]', '(9, 10]'], dtype=object)

In [15]: cat.labels
Out[15]: array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0])

然后你可以直接对标签进行映射:

In [16]: map({0: 'low', 1: 'high'}.get, cat.labels)
Out[16]: ['low', 'high', 'low', 'low', 'low', 'low', 'low', 'low', 'low', 'low']

或者你也可以直接修改这些级别(也就是名字):

In [17]: cat.levels = ['low', 'high']

In [18]: cat
Out[18]:
  low
 high
  low
  low
  low
  low
  low
  low
  low
  low
Levels (2): Index(['low', 'high'], dtype=object)

你可以把这个设置为一个序列或者数据框中的一列。

其实,你可以使用 labels 这个参数直接获取这些:

In [21]: pd.cut(s, [0, 9, 10], labels=['low', 'high'])

撰写回答