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

时间:2014-03-17 23:36:45

标签: python pandas

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

例如:

|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''高'等等

然后,该函数将创建包含其中类别的新列。

1 个答案:

答案 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的系列或列。

实际上,您可以使用labels参数直接获取此信息:

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