内部结构#

本节将介绍一些 pandas 的内部机制。这主要是为 pandas 的开发者准备的。

索引#

在 pandas 中,有几种对象可以作为轴标签的有效容器:

  • 索引: 通用的“有序集合”对象,一个假设其内容无任何特定属性的对象类型的ndarray。标签必须是可哈希的(且可能是不可变的)且唯一。在Cython中填充一个标签到位置的字典,以实现``O(1)``查找。

  • MultiIndex:标准的多层次索引对象

  • DatetimeIndex: 一个包含 Timestamp 元素的 Index 对象(实现为 int64 值)

  • TimedeltaIndex:一个包含 Timedelta 元素的 Index 对象(实现是 in64 值)

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

有一些函数使得创建一个常规索引变得容易:

  • date_range():从时间规则或日期偏移量生成的固定频率日期范围。一个包含Python日期时间对象的ndarray。

  • period_range(): 从时间规则或 DateOffset 生成的固定频率日期范围。一个 Period 对象的 ndarray,表示时间段

警告

自定义 Index 子类不受支持,应使用 ExtensionArray 接口来实现自定义行为。

MultiIndex#

在内部,MultiIndex 由以下几部分组成:**levels**(层级)、整数 **codes**(代码)和层级 **names**(名称):

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_tuples()from_arrays() 确保了这一点,但如果你自己计算层级和代码,请小心。

#

pandas 通过自定义类型扩展了 NumPy 的类型系统,例如 Categorical 或带时区的日期时间,因此我们有多种“值”的概念。对于 1-D 容器(Index 类和 Series),我们有以下约定:

  • cls._values 指的是“最佳可能”的数组。这可能是一个 ndarrayExtensionArray

因此,例如,Series[category]._values 是一个 Categorical

子类化 pandas 数据结构#

本节已移至 子类化 pandas 数据结构