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

Posted

技术标签:

【中文标题】何时使用类别而不是对象?【英文标题】:When to use Category rather than Object? 【发布时间】:2015-08-16 14:02:21 【问题描述】:

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

我的问题是:

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

【问题讨论】:

没有理由不在这里使用类别。如果字符串很长,也会节省大量空间/内存(您可以检查 info()memory_usage() btw。dtype 中的 't' 也不大写。 【参考方案1】:

当您希望利用大量重复时使用一个类别。

例如,假设我想要一个大型交易表的每个交易所的总规模。使用默认的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

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

【讨论】:

感谢您的回答!所以分类类型更适合内存优化。 使用分类的另一个原因是它们可以为您的分类提供(不是默认的)排序。例如。也许['小','中','大']。然后你可以按这个排序!请参阅文档here【参考方案2】:

Pandas 文档中有一个 concise section 说明何时使用 categoricaldata 类型:

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

仅由几个不同值组成的字符串变量。 将这样的字符串变量转换为分类变量将节省 一些内存,请参阅here。 变量的词法顺序不同 作为逻辑顺序(“一”、“二”、“三”)。通过转换为 分类并指定类别的顺序,排序和 min/max 将使用逻辑顺序而不是词法顺序,请参阅 here。 作为向其他 Python 库发出的信号,表明该列应该是 被视为分类变量(例如,使用合适的统计 方法或绘图类型)。

【讨论】:

以上是关于何时使用类别而不是对象?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 Var 而不是函数?

何时使用类别以及何时使用子类化? [关闭]

为啥使用片段,以及何时使用片段而不是活动?

何时使用 TestFixtureSetUp 属性而不是默认构造函数?

何时使用 ADOX 而不是 ADCX?

AngularJS:何时使用服务而不是工厂