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 列を削除する方法
- Pandas で DataFrame 列を日時に変換する方法
- Pandas DataFrame で浮動小数点数 float を整数 int に変換する方法
- Pandas DataFrame を 1つの列の値で並べ替える方法
- Pandas group-by と Sum の集計を取得する方法