内部構造#
このセクションでは、pandasの内部構造についていくつか説明します。主にpandas自体の開発者を対象としています。
インデックス#
pandasでは、軸ラベルの有効なコンテナとして機能するいくつかのオブジェクトが実装されています。
Index
: ジェネリックな「順序付き集合」オブジェクトで、内容について何も仮定しないオブジェクトdtypeのndarrayです。ラベルはハッシュ可能(かつおそらく不変)で、一意である必要があります。Cythonでラベルから位置への辞書を作成し、O(1)
のルックアップを行います。MultiIndex
: 標準的な階層インデックスオブジェクトDatetimeIndex
:Timestamp
のボックス化された要素を持つインデックスオブジェクト(実装はint64値です)TimedeltaIndex
:Timedelta
のボックス化された要素を持つインデックスオブジェクト(実装はint64値です)PeriodIndex
: Period要素を持つインデックスオブジェクト
正規インデックスの作成を容易にする関数があります。
date_range()
: 時間ルールまたはDateOffsetから生成される固定頻度の日付範囲。Pythonのdatetimeオブジェクトのndarrayperiod_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]._values
はCategorical
です。
pandasデータ構造のサブクラス化#
このセクションはpandasデータ構造のサブクラス化に移動しました。