内件#

这一部分将介绍大Pandas的一些内部结构。它主要是为Pandas本身的开发者设计的。

标引#

在Pandas中,有几个实现的对象可以作为轴标签的有效容器:

  • Index :一般的“有序集”对象,一种不假定其内容的对象数据类型的ndarray。标签必须是可散列的(并且可能是不可变的)和唯一的。将标签的字典填充到Cython中要做的位置 O(1) 查找。

  • Int64Index :一个版本的 Index 针对64位整数数据(如时间戳)进行了高度优化

  • Float64Index :一个版本的 Index 针对64位浮点数据进行了高度优化

  • MultiIndex :标准的分层索引对象

  • DatetimeIndex :具有以下内容的Index对象 Timestamp 已装箱的元素(Iml是int64值)

  • TimedeltaIndex :具有以下内容的Index对象 Timedelta 已装箱的元素(Iml是in64值)

  • PeriodIndex :包含Period元素的Index对象

有一些函数可以简化常规索引的创建:

  • date_range :由时间规则或DateOffset生成的固定频率日期范围。一大堆Python DateTime对象

  • period_range :由时间规则或DateOffset生成的固定频率日期范围。一大群人 Period 对象,表示时间跨度

拥有一个 Index 类首先是为了实现索引的不同实现。这意味着,作为用户,您可以实现自定义 Index 可能比Pandas中提供的更适合特定应用的子类。

从内部实现的角度来看, Index 必须定义以下一项或多项(取决于新对象内部与 Index 功能):

  • get_loc :返回标签的“索引器”(一个整数,在某些情况下是切片对象)

  • slice_locs :返回要在两个标签之间切片的“范围”

  • get_indexer :计算索引向量以用于重新编制索引/数据对齐。有关这方面的更多信息,请参阅源代码/文档字符串

  • get_indexer_non_unique :当索引不是唯一的时,计算索引向量以用于重新索引/数据对齐。有关这方面的更多信息,请参阅源代码/文档字符串

  • reindex: Does any pre-conversion of the input index then calls get_indexer

  • unionintersection :计算两个Index对象的并集或交集

  • insert :将新标签插入索引,生成新对象

  • delete :删除标签,生成新对象

  • drop :删除一组标签

  • take :类似于ndarra.tak.

MultiIndex#

在内部, MultiIndex 由以下几项组成: 级别 ,该整数 代码 (直到版本0.24命名 标签 ),以及级别 姓名

In [1]: index = pd.MultiIndex.from_product(
   ...:     [range(3), ["one", "two"]], names=["first", "second"]
   ...: )
   ...: 

In [2]: index
Out[2]: 
MultiIndex([(0, 'one'),
            (0, 'two'),
            (1, 'one'),
            (1, 'two'),
            (2, 'one'),
            (2, 'two')],
           names=['first', 'second'])

In [3]: index.levels
Out[3]: FrozenList([[0, 1, 2], ['one', 'two']])

In [4]: index.codes
Out[4]: FrozenList([[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

In [5]: index.names
Out[5]: FrozenList(['first', 'second'])

您可能会猜到,代码决定了在索引的每一层上用该位置标识哪个唯一元素。重要的是要注意到,排序是由 仅限于 并且不检查(或关心)级别本身是否被排序。幸运的是,构造函数 from_tuplesfrom_arrays 确保这是真的,但如果您自己计算级别和代码,请小心。

#

Pandas用定制类型扩展了NumPy的类型系统,如 Categorical 或者具有时区的DateTime,所以我们有多个“值”的概念。对于一维容器 (Index 类和 Series )我们有以下惯例:

  • cls._values Refers是“尽可能好的”数组。这可能是一个 ndarrayExtensionArray

所以,举例来说, Series[category]._values 是一种 Categorical

对Pandas数据结构进行子类化#

此部分已移至 对Pandas数据结构进行子类化