【问题标题】:Categorize Data in a column in dataframe对数据框中的列中的数据进行分类
【发布时间】:2016-12-20 13:59:23
【问题描述】:

我的数据框中有一列数字,我想将这些数字分类为例如高、低、排除。我如何做到这一点。我一无所知,我已经尝试查看 cut 函数和类别数据类型。

【问题讨论】:

  • 不,我没有..我必须使用 numpy 吗?认为熊猫应该能够做到这一点
  • 对不起,我在写完答案后删除了评论。是的,你可以使用 pandas。
  • IIUC cut 应该可以完成这项工作。您可以将bins(箱边缘)的数组以及箱的labels 传递给它。查看docs中的示例
  • 其实我之前也看过cut这个函数,很迷惑,看不懂

标签: python pandas machine-learning data-analysis


【解决方案1】:

pd.cut 的简短示例。

让我们从一些数据框开始:

df = pd.DataFrame({'A': [0, 8, 2, 5, 9, 15, 1]})

例如,我们想将数字分配给以下类别:'low' 如果数字在区间 [0, 2]'mid' 代表 (2, 8]'high' 代表 (8, 10],我们排除大于 10(或小于 0)的数字。

因此,我们有 3 个带边的 bin:0、2、8、10。现在,我们可以使用 cut,如下所示:

pd.cut(df['A'], bins=[0, 2, 8, 10], include_lowest=True)
Out[33]: 
0     [0, 2]
1     (2, 8]
2     [0, 2]
3     (2, 8]
4    (8, 10]
5        NaN
6     [0, 2]
Name: A, dtype: category
Categories (3, object): [[0, 2] < (2, 8] < (8, 10]]

参数include_lowest=True 包括第一个区间的左端。 (如果您希望在右侧打开间隔,请使用right=False。)

区间可能不是类别的最佳名称。所以,让我们使用名称:low/mid/high:

pd.cut(df['A'], bins=[0, 2, 8, 10], include_lowest=True, labels=['low', 'mid', 'high'])
Out[34]: 
0     low
1     mid
2     low
3     mid
4    high
5     NaN
6     low
Name: A, dtype: category
Categories (3, object): [low < mid < high]

排除的数字 15 获得“类别”NaN。如果您喜欢更有意义的名称,可能最简单的解决方案(还有其他处理 NaN 的方法)是添加另一个 bin 和类别名称,例如:

pd.cut(df['A'], bins=[0, 2, 8, 10, 1000], include_lowest=True, labels=['low', 'mid', 'high', 'excluded'])
Out[35]: 
0         low
1         mid
2         low
3         mid
4        high
5    excluded
6         low
Name: A, dtype: category
Categories (4, object): [low < mid < high < excluded]

【讨论】:

  • 我现在得到了这个例子,非常有帮助..bless
【解决方案2】:

这个问题非常广泛,但文档中的这个页面可能是一个很好的起点:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

或者你可以查看 numpy.where

    import numpy as np
    df['is_high'] = np.where(df.['column_of_interest'] > 5 ,1,0) 

【讨论】:

  • 好的,我会检查一下。虽然我认为熊猫应该能够在没有 numpy 的情况下做到这一点
  • 我已经检查过了,我的输出以布尔值给出,然后我这样做high = result['Traded Value'] &gt; 2.983150e+09 然后print result[high] 它给了我想要的输出(显示的数字大于那个)。然后,我尝试使用 result = result.assign(high=high.values) 将结果附加到我的数据框上的新列中,当我显示数据框时,该新列结果是布尔值而不是数值......我对该怎么做感到困惑。跨度>
  • 您想要的输出(在此评论中)与您问题中的输出不同?您的问题似乎源于“高”是布尔掩码这一事实。要返回值,您需要将掩码应用于要从中返回值的列。
  • eg) 使用我链接的文档中的数据,您可以使用: df['A_column_high_values'] = df.A[df['A']>10] 〜给你一个列如果它大于 10,则为 'A' 的值,否则为 NaN。
  • 是的,它是不同的,但是当我问这个问题时,我从来不知道我的输出是布尔值,当我添加新列时实际上需要数值
猜你喜欢
  • 1970-01-01
  • 2014-04-23
  • 2021-12-22
  • 2020-01-08
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2020-08-05
相关资源
最近更新 更多