根据值对pandas数据框中的数据进行分类
我经常需要对一系列数字进行分类:
比如说:
|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'])