内部结构#

本节将介绍 pandas 的一些内部结构。它主要面向 pandas 本身的开发人员。

索引#

在 pandas 中,实现了一些可以用作轴标签的有效容器的对象:

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

  • MultiIndex:标准层次索引对象

  • DatetimeIndex:带有装箱元素的 Index 对象Timestamp(impl 是 int64 值)

  • TimedeltaIndex:带有装箱元素的 Index 对象Timedelta(impl 是 in64 值)

  • PeriodIndex: 带有Period元素的Index对象

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

  • date_range():从时间规则或 DateOffset 生成的固定频率日期范围。 Python 日期时间对象的 ndarray

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

警告

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

多重索引#

在内部,它MultiIndex由几部分组成:级别、整数代码和级别名称

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,因此我们有多种“值”概念。对于一维容器(Index类 和Series),我们有以下约定:

  • cls._values引用是“最好的可能”数组。这可能是一个 ndarrayExtensionArray

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

子类化 pandas 数据结构#

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