内部構造#

このセクションでは、pandasの内部構造についていくつか説明します。主にpandas自体の開発者を対象としています。

インデックス#

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

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

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

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

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

  • PeriodIndex: Period要素を持つインデックスオブジェクト

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

  • 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やタイムゾーンを持つdatetimeなどのカスタム型でNumPyの型システムを拡張しているため、「値」の概念が複数あります。1次元コンテナ(IndexクラスとSeries)の場合、次の規約があります。

  • cls._valuesは、「可能な限り最高の」配列を指します。これは、ndarrayまたはExtensionArrayの場合があります。

たとえば、Series[category]._valuesCategoricalです。

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

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