Pandas DataFrame の列ヘッダーをリストとして取得する方法

Aliaksei Yursha 2021年2月9日
Pandas DataFrame の列ヘッダーをリストとして取得する方法

Pandas は、Python でのデータ分析用のオープンソースパッケージです。
pandas.DataFrameは、主要な Pandas データ構造です。
これは、ラベル付き軸(行と列)を持つ 2 次元の表形式のデータ構造です。

広範囲にわたるユースケースは、DataFrame オブジェクトから列ヘッダーのリストを取得することです。

このチュートリアルの他のすべてのコード例では、以下で定義する DataFrame オブジェクトを再利用します。

>>> import pandas
>>> cities = {
...   'name': ['New York', 'Los Angeles', 'Chicago'],
...   'population': [8601186, 4057841, 2679044],
...   'state': ['NY', 'CA', 'IL'],
... }
>>> data_frame = pandas.DataFrame(cities)

DataFrame カラム名を保持する 1つの方法は、DataFrame オブジェクト自体を繰り返し処理することです。
DataFrame イテレータは、定義順に列名を返します。

>>> for column in data_frame:
...   print(column)
...
name
population
state

イテラブルをリストに変換する必要がある場合、Python の組み込みの list 関数を呼び出すことができます。

>>> list(data_frame)
['name', 'population', 'state']

ただし、この方法のパフォーマンスは遅くなります。

>>> from timeit import timeit
>>> timeit(lambda: list(data_frame))
7.818843764999997

また、DataFrame オブジェクトをより深く走査して、DataFrame.columns プロパティから列にアクセスすることもできます。

>>> list(data_frame.columns)
['name', 'population', 'state']

それ以外の場合は、DataFrame.columns.tolist() 関数を使用して同じことを実現できます。

>>> data_frame.columns.tolist()
['name', 'population', 'state']

これらの両方の方法のパフォーマンスはそれほど良くありません。

>>> timeit(lambda: list(data_frame.columns))
7.143133517000024
>>> timeit(lambda: data_frame.columns.tolist())
6.064925153999866

DataFrame.columns.values プロパティにさらに移動すると、物事は大きく変わります。
同様に、DataFrame オブジェクトと DataFrame.columns プロパティと同様に、これを使用して DataFrame 列名のシーケンスを取得できます。

>>> list(data_frame.columns.values)
['name', 'population', 'state']

このアプローチのパフォーマンスは、以前の方法と比較して 5〜6 倍優れています。

>>> timeit(lambda: list(data_frame.columns.values))
1.301724927000123

それでも、組み込みの DataFrame.columns.values.tolist() メソッドを使用すると、最高のランタイムを実現できます。

>>> data_frame.columns.values.tolist()
['name', 'population', 'state']
>>> timeit(lambda: data_frame.columns.values.tolist())
0.6860591469999235

ご覧のとおり、このアプローチのパフォーマンスは、DataFrame オブジェクトを直接繰り返し処理した場合よりも 10 倍以上優れています。
ほとんどのエンジニアは、このようなパフォーマンスの違いの背後にある理由に興味があります。

答えは、DataFrame.columns.values プロパティのデータ型に隠れています。
NumPy 配列です。
NumPy は科学計算用の Python パッケージであり、メンテナーはパフォーマンスのために高度に最適化します。

Pandas は NumPy の上に構築され、便利な高レベルの抽象化を提供します。
したがって、低レベルの NumPy データ構造で直接操作を実行すると、Pandas の高レベルデータ構造で同様の操作を実行するよりもほとんど常に高速になります。

関連記事 - Pandas DataFrame

関連記事 - Pandas DataFrame Column