【问题标题】:categorising data in a pandas dataframe based on value根据值对熊猫数据框中的数据进行分类
【发布时间】:2014-04-23 10:31:57
【问题描述】:

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

例如:

|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:数据框名称 参数 2:pandas 数据框中的列名(与函数 1 中的相同) 参数 3。您要在数据框中创建的新列的名称。 参数 4. 来自功能 1 的一组范围。 参数 5. 以及类别列表,['low','med','high'] 等

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

【问题讨论】:

  • 1.你的问题不清楚。你到底想做什么(你的数据结构需要支持哪些操作)? 2.你为什么不直接使用dict?
  • 好吧 Def 肯定行不通。
  • 您是否只想唯一标识您的类别并只执行一次?如果您的类别可以增长并且含义可以改变,即您有动态扩展的类别,其中可能有超过 10 个类别可能被归类为低类别,那么您也必须重新分类,这会使其变慢
  • @EDCHUM 从这个意义上说,类别不会动态扩展。只是在某种意义上,如果我想对一列数字进行分类,我想我可能会经常这样做,那么为什么不为其创建一个函数呢?

标签: python pandas


【解决方案1】:

我想你在找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'])

【讨论】:

  • 大家好,抱歉看了文档我不知道 CUT 函数的作用是什么?
  • 它将数据分成范围,在这种情况下(当我传递了 0、9 和 10 时,它会将其分为两组:0 到 9 之间,9 到 10 之间。
  • 在 "pd.cut(s, [0, 9, 10], labels=['low', 'high'])" 中你定义:范围 1 (0-9),范围 2 (9&10)?对我来说,0、9、10 只是三个数字,而不是两个独立的范围?
  • 范围 1(低)0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2020-06-22
  • 2021-02-27
  • 2021-11-02
  • 2013-07-30
  • 2022-07-19
相关资源
最近更新 更多