何时使用类别而不是对象?

39

我有一个包含40个特征的CSV数据集,使用Pandas进行处理。其中7个特征是连续型(int32),其余的都是分类型。

我的问题是:

对于分类特征,我应该使用Pandas的dtype('category')还是可以让它默认为dtype('object')


2
没有理由不在这里使用一个类别。如果字符串非常长,还可以节省很多空间/内存(你可以用info()memory_usage()来检查一下)。另外,dtype中的't'不应该大写。 - JohnE
2个回答

27

当您希望利用大量重复时,请使用类别(category)。

例如,假设我想为一张大的交易表计算每个交易所的总量。在这种情况下,默认使用 object 是完全合理的:

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

但由于可能的交换清单相当少,并且存在许多重复,因此我可以通过使用 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
请确认以下是否符合您的要求:

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



1
谢谢你的回答!因此,分类类型更适合进行内存优化。 - user4640449
7
使用Categorical的另一个原因是它们可以(但默认情况下不会)为您的类别提供排序。例如,['small','medium','large']。然后您就可以按此进行排序!请参阅此处的文档。 - Jeff

24
Pandas文档中有一个关于何时使用数据类型的简洁部分

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

  • 字符串变量只包含少量不同的值。将这样的字符串变量转换为分类变量将节省一些内存,参见这里
  • 变量的词汇顺序与逻辑顺序不同(“one”,“two”,“three”)。通过转换为分类变量并在类别上指定顺序,排序和最小/最大值将使用逻辑顺序而不是词汇顺序,参见这里
  • 作为向其他Python库发出信号的标志,表明此列应视为分类变量(例如,使用合适的统计方法或图表类型)。

对象和分类变量有什么区别?哪一个等同于R中的“因子”? - skan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接