内部结构#
本节将介绍 pandas 的一些内部结构。主要面向 pandas 本身的开发者。
索引#
在 pandas 中,有几种对象可以作为轴标签的有效容器。
Index:通用的“有序集”对象,一个 dtype 为 object 的 ndarray,不对其内容做任何假设。标签必须是可哈希的(并且很可能是不可变的)和唯一的。通过 Cython 中的一个字典将标签映射到位置,以实现O(1)的查找。MultiIndex:标准的层次索引对象。DatetimeIndex:一个 Index 对象,包含Timestamp装箱元素(内部实现为 int64 值)。TimedeltaIndex:一个 Index 对象,包含Timedelta装箱元素(内部实现为 int64 值)。PeriodIndex:一个 Index 对象,包含 Period 元素。
有一些函数可以方便地创建常规索引。
date_range():根据时间规则或 DateOffset 生成固定频率的日期范围。一个 Python datetime 对象数组。period_range():根据时间规则或 DateOffset 生成固定频率的日期范围。一个Period对象数组,代表时间段。
警告
不支持自定义 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 或带有时区的日期时间,因此我们有多种“值”的概念。对于一维容器(Index 类和 Series),我们有以下约定:
cls._values指的是“最佳可能”的数组。这可能是一个ndarray或ExtensionArray。
因此,例如,Series[category]._values 是一个 Categorical。
子类化 pandas 数据结构#
本节已移至 子类化 pandas 数据结构。