内件#
这一部分将介绍大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 callsget_indexer
union
,intersection
:计算两个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_tuples
和 from_arrays
确保这是真的,但如果您自己计算级别和代码,请小心。
值#
Pandas用定制类型扩展了NumPy的类型系统,如 Categorical
或者具有时区的DateTime,所以我们有多个“值”的概念。对于一维容器 (Index
类和 Series
)我们有以下惯例:
cls._values
Refers是“尽可能好的”数组。这可能是一个ndarray
或ExtensionArray
。
所以,举例来说, Series[category]._values
是一种 Categorical
。
对Pandas数据结构进行子类化#
此部分已移至 对Pandas数据结构进行子类化 。