何时使用Category而不是Object?

use*_*449 16 python csv types dataset pandas

我有一个包含40个功能的CSV数据集,我正在处理Pandas.7个特征是连续的(int32),其余的是绝对的.

我的问题是:

我应该使用dtype('category')Pandas作为分类功能,还是可以使用默认值dtype('object')

chr*_*ock 11

当您希望利用大量重复时使用类别.

例如,假设我想要一个大型交易表的每个交易所的聚合大小.使用默认值object是完全合理的:

In [6]: %timeit trades.groupby('exch')['size'].sum()
1000 loops, best of 3: 1.25 ms per loop
Run Code Online (Sandbox Code Playgroud)

但由于可能的交换列表非常小,而且因为有很多重复,我可以通过使用category:

In [7]: trades['exch'] = trades['exch'].astype('category')

In [8]: %timeit trades.groupby('exch')['size'].sum()
1000 loops, best of 3: 702 µs per loop
Run Code Online (Sandbox Code Playgroud)

请注意,类别实际上是动态枚举的一种形式.如果可能值的范围是固定且有限的,则它们最有用.

  • 使用Categoricals的另一个原因是,他们*可以*提供(因为它不是默认值),*排序*到您的类别.例如,可能['小','中','大'].然后你可以按此排序!参见文档[这里](http://pandas.pydata.org/pandas-docs/stable/categorical.html#sorting-and-order) (5认同)

wil*_*llk 7

Pandas文档中简要介绍了何时使用categorical数据类型:

在以下情况下,分类数据类型很有用:

  • 一个仅包含几个不同值的字符串变量。将这样的字符串变量转换为分类变量将节省一些内存,请参见此处
  • 变量的词汇顺序与逻辑顺序(“一个”,“两个”,“三个”)不同。通过转换为类别并在类别上指定顺序,排序和最小/最大将使用逻辑顺序而不是词汇顺序,请参见 此处
  • 作为向其他Python库的信号,应将此列视为类别变量(例如,使用适当的统计方法或绘图类型)。