内部#

このセクションでは、pandas の内部構造の一部について説明します。これは主に pandas 開発者向けです。

インデックス付け#

pandas には、軸ラベルの有効なコンテナーとして機能するいくつかのオブジェクトが実装されています。

  • Index: 一般的な「順序付けられたセット」オブジェクトで、内容について何も仮定しないオブジェクト dtype の ndarray です。ラベルはハッシュ可能(おそらく不変)で一意である必要があります。Cython でラベルから位置への辞書を作成し、O(1) のルックアップを行います。

  • MultiIndex: 標準的な階層型インデックスオブジェクト

  • DatetimeIndex: Timestamp ボックス化された要素を持つ Index オブジェクト (実装は int64 値)

  • TimedeltaIndex: Timedelta ボックス化された要素を持つ Index オブジェクト (実装は int64 値)

  • PeriodIndex: Period 要素を持つ Index オブジェクト

通常のインデックスの作成を容易にする関数があります。

  • date_range(): 時間ルールまたは DateOffset から生成される固定頻度の日付範囲。Python の datetime オブジェクトの 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 は、Categorical やタイムゾーン付きの日付/時刻のようなカスタム型で NumPy の型システムを拡張しているため、「値」の概念が複数あります。1D コンテナー (Index クラスと Series) では、次の規則があります。

  • cls._values は「可能な限り最良の」配列を指します。これは ndarray または ExtensionArray のいずれかです。

したがって、例えば Series[category]._valuesCategorical です。

pandas データ構造のサブクラス化#

このセクションはpandas データ構造のサブクラス化に移動しました。