可能很明显,但我只是想确认一下:

Pandas 中最适合数字ID的数据类型是什么?

假设我有一个顺序数字ID类型user_id,这会更好:

  • int64型(考虑到字段的数字表示,这似乎是最明显的 Select )
  • category类型(考虑到ID不用于实际的数字操作,而是作为唯一标识符,这可能更有意义)

对于基于字符的ID,同样的问题是,使用object还是category类型更好?

我很想使用category数据类型(认为可能会有性能优势,因为我可以想象这些类别会以某种方式优化/散列/索引以提高性能),但我想知道这种数据类型是否比我的数据集中可能存在的数千个唯一用户ID中的category个更适合更有限的不同值子集.

谢谢

推荐答案

对对象类型的数据帧/数组的操作速度很慢,因为Pandas需要使用效率低下的CPython interpreter对每个项进行操作.由于引用计数、内部指针间接寻址、类型判断、内部函数调用等原因,这会导致较高的开销.Pandas通常在内部使用Numpy,当类型为本机类型(如int64int32float64等)时,Numpy的速度会快得多.在这种情况下,Numpy可以执行优化的本机代码,该代码不会因CPython开销而变慢,甚至可以受益于硬件SIMD单元(关于所使用的目标函数).虽然Numpy支持有界字符串,但Pandas不使用它,而是使用较慢的CPython字符串对象.Strings are inherently slow,即使在本机代码中也是如此,因为它们的大小通常是可变的,这通常是可预测的(这强烈影响了需要预测分支以便快速运行的处理器,请参见this post about branch prediction).实际上,unicode characters make strings even slower(这使得SIMD指令的使用非常困难,分支更难预测).Categorial are basically integers associated with a mapping table(具有唯一值).从理论上讲,对于某些计算,分类列可以更快,因为表已经计算过了.然而,初始计算为the table can be expensive.此外,表格的使用效率并不总是很高,有时可能会导致surprisingly slower execution compared to integers.更不用说,当所有值都不同时,表格可能会很大.Integers are the less expensive type. Smaller integer can often be faster. 实际上,SIMD向量的大小是固定的(例如,由86-64个处理器组成的AVX-2 SIMD指令集可以计算一行中的32 int8个值,而只有4 int64个).此外,较小的项会导致整列占用较少的内存,从而降低内存吞吐量,从而提高内存绑定代码的性能(从Pandas中非常频繁的数据帧拷贝开始).然而,这并不总是更快,因为较小的类型有时会导致类型转换增加额外的开销(尽管可以使用较低级别的优化来缓解此开销).因此,如果您正在处理巨大的数据帧,请考虑使用小整数类型.否则,int64当然是一个很好的 Select .

Python相关问答推荐

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

OR—Tools中CP—SAT求解器的IntVar设置值

关于Python异步编程的问题和使用await/await def关键字

如何从数据库上传数据到html?

在含噪声的3D点网格中识别4连通点模式

创建可序列化数据模型的最佳方法

Django RawSQL注释字段

需要帮助重新调整python fill_between与数据点

Pandas:计算中间时间条目的总时间增量

剪切间隔以添加特定日期

30个非DATETIME天内的累计金额

Seaborn散点图使用多个不同的标记而不是点

极柱内丢失类型信息""

在round函数中使用列值

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

如何将django url参数传递给模板&S url方法?

Python:使用asyncio.StreamReader.readline()读取长行

IpyWidget Select 框未打开

Python-迭代PANAS中的数据框并替换列表中不包含字符串的值