我经常需要对一系列数字进行分类:
例如:
|Num| cat|
| 2 |low |
| 7 | med|
| 10|high|
我想要的!我想构建两个函数。
功能1. - 接受3个参数: 参数1:数据帧名称 参数2:数据框中的列名 参数3:许多类别,例如我想要(5)。
此函数将根据我想要的5个类别计算出最大值,最小值和返回值:(1,2),(3,4),(5,6),(7,8) ),(9,10)。
我在想类似(max - min)/ num类别的东西,但不知怎的,它会解决这些范围。
然后,函数1将返回范围,(1,2),(3,4),(5,6),(7,8),(9,10)。
功能2 .- 将采用3个参数: 参数1:数据帧nam 参数2:来自pandas数据帧的列名(与函数1中的相同) 参数3.要在数据框中创建的新列的名称。 参数4.函数1中的一组范围。 参数5.以及类别列表,['低'' med''高'等等
然后,该函数将创建包含其中类别的新列。
答案 0 :(得分: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)
您可以将其设置为DataFrame的系列或列。
In [21]: pd.cut(s, [0, 9, 10], labels=['low', 'high'])