Pandasカラム名一覧の取得方法について
Pandasは、Pythonプログラミング言語で使用される、データ操作および分析のための高速で柔軟かつ表現力豊かなオープンソースのライブラリです。特に、構造化された表形式データ(スプレッドシートやデータベースのテーブルのようなデータ)を扱うのに非常に適しています。Pandasの中心的なデータ構造は、Series
(一次元配列のようなオブジェクト)とDataFrame
(二次元のラベル付きデータ構造、列が異なる型を持つことができます)です。
データ分析や前処理を行う上で、DataFrameに含まれる列(カラム)の名前を知ることは非常に重要です。カラム名が分からなければ、特定の列を選択したり、データを操作したり、分析を進めたりすることができません。この記事では、Pandas DataFrameのカラム名一覧を取得する様々な方法について、詳細に解説します。基本的な取得方法から、応用的な抽出方法、MultiIndexの場合の扱い方、そして取得したカラム名リストの活用方法まで、網羅的に説明していきます。
1. はじめに:PandasとDataFrame、そしてカラム名の重要性
1.1 Pandasとは
Pandasは、データサイエンスや機械学習の分野で最も広く使われているPythonライブラリの一つです。主な機能として、データ構造(DataFrame, Series)を提供し、以下のような多様なデータ操作を効率的に行うことができます。
- データの読み込み・書き出し(CSV, Excel, データベースなど)
- データのクリーニング・前処理(欠損値処理、重複削除など)
- データの選択・フィルタリング
- データの集計・要約
- データの結合・マージ
- 時系列データ処理
PandasはNumPy(数値計算ライブラリ)に基づいて構築されており、高いパフォーマンスでデータ処理を実行できます。
1.2 DataFrameとは
DataFrameは、Pandasにおける最も重要なデータ構造です。スプレッドシートやリレーショナルデータベースのテーブルに似た、列と行を持つ二次元のラベル付きデータ構造としてデータを表現します。
- 列(Columns): 各列は異なるデータ型を持つことができます(整数、浮動小数点数、文字列、日付など)。各列は「カラム名」というラベルを持ちます。
- 行(Rows): 各行には「インデックス(Index)」というラベル(または番号)が付けられます。デフォルトでは0から始まる連番ですが、任意の値をインデックスとして設定することも可能です。
DataFrameは、大量の構造化データを扱う上で非常に便利であり、多くのデータ分析作業の出発点となります。
1.3 カラム名の重要性
DataFrameを扱う上で、カラム名はデータの意味を理解し、特定のデータ列にアクセスするための鍵となります。
- データへのアクセス: カラム名を使って、DataFrameから特定の列を選択したり、操作したりできます。例えば、
df['列名']
のように指定します。 - データの理解: カラム名は、その列にどのような種類のデータが格納されているかを示します。例えば、「顧客ID」「商品名」「売上高」といったカラム名を見ることで、データの構成を直感的に把握できます。
- データ操作: カラム名に基づいて、列の追加、削除、名前変更、データの並べ替え、集計など、様々な操作を行います。
- 連携と共有: 他のユーザーやシステムとデータを共有する際に、意味のあるカラム名が付いていることはデータの解釈性を高め、作業を円滑にします。
したがって、DataFrameに含まれるカラム名の一覧を取得することは、データ分析の最初のステップとして、あるいは分析の途中でデータの構造を確認する上で、非常に頻繁に行われる操作です。
2. Pandas DataFrameの作成例
カラム名の一覧取得方法を説明する前に、まずはサンプルとなるPandas DataFrameを作成しましょう。以下の例では、Pythonの辞書からDataFrameを作成します。
“`python
import pandas as pd
import numpy as np
サンプルデータの作成
data = {
‘商品ID’: [101, 102, 103, 104, 105],
‘商品名’: [‘りんご’, ‘バナナ’, ‘みかん’, ‘ぶどう’, ‘もも’],
‘価格’: [120, 80, 150, 300, 250],
‘在庫数’: [50, 120, 80, 30, 60],
‘最終更新日’: pd.to_datetime([‘2023-10-01’, ‘2023-10-02’, ‘2023-10-01’, ‘2023-10-03’, ‘2023-10-02’]),
‘割引適用’: [True, False, True, False, True],
‘評価’: [4.5, 3.8, np.nan, 4.9, 4.2] # np.nanは欠損値
}
df = pd.DataFrame(data)
作成したDataFrameを表示
print(“— 作成したDataFrame —“)
print(df)
“`
出力例:
--- 作成したDataFrame ---
商品ID 商品名 価格 在庫数 最終更新日 割引適用 評価
0 101 りんご 120 50 2023-10-01 True 4.5
1 102 バナナ 80 120 2023-10-02 False 3.8
2 103 みかん 150 80 2023-10-01 True NaN
3 104 ぶどう 300 30 2023-10-03 False 4.9
4 105 もも 250 60 2023-10-02 True 4.2
このDataFrame df
には、「商品ID」、「商品名」、「価格」、「在庫数」、「最終更新日」、「割引適用」、「評価」というカラムがあります。これらのカラム名を取得する方法を見ていきましょう。
3. カラム名一覧を取得する最も基本的な方法:.columns
属性
Pandas DataFrameのカラム名一覧を取得する最もシンプルで直接的な方法は、DataFrameオブジェクトの.columns
属性にアクセスすることです。
.columns
属性は、DataFrameの列のラベル(カラム名)を保持する特別なPandasのIndex
オブジェクトを返します。
3.1 .columns
属性の使い方
DataFrameオブジェクトに対して .columns
と記述するだけです。
“`python
dfからカラム名一覧を取得
column_names = df.columns
取得したカラム名を表示
print(“— df.columns の結果 —“)
print(column_names)
“`
出力例:
--- df.columns の結果 ---
Index(['商品ID', '商品名', '価格', '在庫数', '最終更新日', '割引適用', '評価'], dtype='object')
3.2 返されるオブジェクトの型
.columns
属性が返すのは、Pythonのリストのように見えますが、実際にはpandas.Index
という型のオブジェクトです。
“`python
取得したオブジェクトの型を確認
print(“\n— df.columns の型 —“)
print(type(column_names))
“`
出力例:
--- df.columns の型 ---
<class 'pandas.core.indexes.base.Index'>
Index
オブジェクトはリストに似ていますが、主にラベルの検索や集合演算に最適化されており、データ分析において効率的な操作を行うためのPandas独自のデータ構造です。イテラブル(iterable)であるため、forループで各カラム名にアクセスできます。
“`python
カラム名を一つずつ表示する例
print(“\n— 各カラム名 —“)
for col in df.columns:
print(col)
“`
出力例:
--- 各カラム名 ---
商品ID
商品名
価格
在庫数
最終更新日
割引適用
評価
3.3 .columns
属性の利点
- シンプルさ: カラム名を取得する最も直接的で簡単な方法です。
- 効率性: カラム名を取得するだけであれば、データ全体にアクセスする必要がないため非常に高速です。特に大規模なDataFrameの場合でも、カラム名の取得は瞬時に行われます。
- Indexオブジェクト: Pandasの他の機能(例えば、列の選択など)との互換性が高く、Indexオブジェクトのまま多くの操作に利用できます。
4. .columns
属性からリストとして取得する方法
.columns
属性はIndex
オブジェクトを返しますが、Pythonの標準的なリストとしてカラム名の一覧が必要になる場面もよくあります(例えば、他のライブラリの関数に渡す場合や、リスト操作を適用したい場合など)。DataFrameのカラム名をリストとして取得するには、いくつかの方法があります。
4.1 DataFrame.columns.tolist()
の使い方
最も一般的で推奨される方法は、Indexオブジェクトが持つ.tolist()
メソッドを使用することです。
“`python
カラム名一覧をリストとして取得
column_list = df.columns.tolist()
取得したリストを表示
print(“— df.columns.tolist() の結果 —“)
print(column_list)
取得したオブジェクトの型を確認
print(“\n— df.columns.tolist() の型 —“)
print(type(column_list))
“`
出力例:
“`
— df.columns.tolist() の結果 —
[‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
— df.columns.tolist() の型 —
“`
.tolist()
メソッドを使うことで、Index
オブジェクトをPythonの標準的なリストに変換できます。これは非常に直感的でよく使われる手法です。
4.2 list(DataFrame.columns)
の使い方
Pythonの組み込み関数であるlist()
を使って、イテラブルなオブジェクト(Index
オブジェクトも含む)をリストに変換することも可能です。
“`python
カラム名一覧をリストとして取得 (list()関数を使用)
column_list_alt = list(df.columns)
取得したリストを表示
print(“— list(df.columns) の結果 —“)
print(column_list_alt)
取得したオブジェクトの型を確認
print(“\n— list(df.columns) の型 —“)
print(type(column_list_alt))
“`
出力例:
“`
— list(df.columns) の結果 —
[‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
— list(df.columns) の型 —
“`
結果は.tolist()
メソッドを使った場合と同じく、リストが得られます。
4.3 .tolist()
とlist()
の違いについて
どちらの方法でもカラム名のリストを取得できますが、Pandasのドキュメントでは通常.tolist()
メソッドを使用することが推奨されています。主な理由は以下の通りです。
- 意図の明確化:
.tolist()
メソッドは、PandasのIndexオブジェクトをリストに変換するという明確な意図を示します。 - Pandasの設計思想: Pandasオブジェクトは、NumPyやPython標準ライブラリのデータ構造との連携をスムーズに行えるように設計されています。
.tolist()
のようなメソッドは、この連携を意図的に提供しています。 - 将来の互換性: 内部的な実装において、
.tolist()
がlist()
よりもわずかに効率的であったり、特殊なケースでの挙換性が高かったりする可能性があります(ただし、カラム名程度の要素数であればパフォーマンスに大きな差は出ません)。
結論として、カラム名をリストとして取得する場合は、.columns.tolist()
を使用するのが最も一般的で推奨される方法と言えます。
5. カラム名をNumPy配列として取得する方法
カラム名をNumPy配列として取得したい場合もあります。これは、NumPyの配列操作を利用したい場合や、特定のライブラリがNumPy配列を入力として要求する場合などに便利です。Indexオブジェクトは、.values
属性または.to_numpy()
メソッドを使用してNumPy配列に変換できます。
5.1 DataFrame.columns.values
の使い方
.values
属性にアクセスすると、Indexオブジェクトに含まれる要素がNumPy配列として返されます。
“`python
カラム名一覧をNumPy配列として取得
column_array = df.columns.values
取得した配列を表示
print(“— df.columns.values の結果 —“)
print(column_array)
取得したオブジェクトの型を確認
print(“\n— df.columns.values の型 —“)
print(type(column_array))
“`
出力例:
“`
— df.columns.values の結果 —
[‘商品ID’ ‘商品名’ ‘価格’ ‘在庫数’ ‘最終更新日’ ‘割引適用’ ‘評価’]
— df.columns.values の型 —
“`
返されるのはnumpy.ndarray
オブジェクトです。
5.2 DataFrame.columns.to_numpy()
の使い方
Pandas 0.24.0以降では、.values
属性の代わりに.to_numpy()
メソッドを使用することが推奨されています。これは、Pandasオブジェクトの内部表現がNumPy配列から異なる形式に変更される可能性に備えるための、より明示的な変換メソッドです。
“`python
カラム名一覧をNumPy配列として取得 (to_numpy()を使用)
column_array_alt = df.columns.to_numpy()
取得した配列を表示
print(“— df.columns.to_numpy() の結果 —“)
print(column_array_alt)
取得したオブジェクトの型を確認
print(“\n— df.columns.to_numpy() の型 —“)
print(type(column_array_alt))
“`
出力例:
“`
— df.columns.to_numpy() の結果 —
[‘商品ID’ ‘商品名’ ‘価格’ ‘在庫数’ ‘最終更新日’ ‘割引適用’ ‘評価’]
— df.columns.to_numpy() の型 —
“`
結果は.values
を使った場合と同じNumPy配列になります。
5.3 .values
と.to_numpy()
について
Pandasでは、オブジェクトの基盤となる内部表現がNumPy配列から他の形式に移行する可能性があります。.values
属性は、その時点での内部表現をそのまま返す傾向がありますが、.to_numpy()
は常にNumPy配列を返すことを保証します。したがって、将来のバージョンの互換性を考慮すると、NumPy配列として取得したい場合は.to_numpy()
メソッドを使用するのがより安全です。
6. 特定の条件を満たすカラム名を取得する方法
DataFrameの全てではなく、特定の条件に合致するカラム名だけを取得したい場合があります。これは、データの探索的分析(EDA)や、特定のデータ型の列だけを抽出して処理したい場合などに非常に有用です。ここでは、いくつかの一般的な条件でのカラム名取得方法を解説します。
6.1 文字列操作に基づく抽出
カラム名が特定の文字列を含むか、特定のパターンに一致するかどうかでフィルタリングする方法です。.columns
属性が返すIndexオブジェクトには、文字列操作のための.str
アクセサが用意されています。
6.1.1 特定の文字列を含むカラム名 (str.contains()
)
カラム名に特定のサブ文字列が含まれているかどうかを判定し、True/Falseのブールインデックスを作成できます。これを使ってカラム名一覧をフィルタリングします。
“`python
例: ‘数’ を含むカラム名を取得
contains_数 = df.columns.str.contains(‘数’)
ブールインデックスを表示
print(“— ‘数’を含むカラム名かどうかのブールインデックス —“)
print(contains_数)
ブールインデックスを使ってカラム名を選択
columns_with_数 = df.columns[contains_数]
print(“\n— ‘数’を含むカラム名 —“)
print(columns_with_数.tolist()) # リストとして表示
“`
出力例:
“`
— ‘数’を含むカラム名かどうかのブールインデックス —
Index([False, False, False, True, False, False, False], dtype=’object’)
— ‘数’を含むカラム名 —
[‘在庫数’]
“`
.str.contains()
は正規表現も使用可能です。大文字・小文字を区別しない検索を行いたい場合は、case=False
オプションを指定します。
“`python
例: ‘ID’ (大文字・小文字区別なし) を含むカラム名を取得
contains_id = df.columns.str.contains(‘id’, case=False)
columns_with_id = df.columns[contains_id]
print(“\n— ‘ID’ (大文字・小文字区別なし)を含むカラム名 —“)
print(columns_with_id.tolist())
“`
出力例:
--- 'ID' (大文字・小文字区別なし)を含むカラム名 ---
['商品ID']
6.1.2 特定の文字列で始まるカラム名 (str.startswith()
)
カラム名が特定の文字列で始まるかどうかを判定します。
“`python
例: ‘商品’ で始まるカラム名を取得
starts_with_商品 = df.columns.str.startswith(‘商品’)
columns_starting_商品 = df.columns[starts_with_商品]
print(“\n— ‘商品’で始まるカラム名 —“)
print(columns_starting_商品.tolist())
“`
出力例:
--- '商品'で始まるカラム名 ---
['商品ID', '商品名']
6.1.3 特定の文字列で終わるカラム名 (str.endswith()
)
カラム名が特定の文字列で終わるかどうかを判定します。
“`python
例: ‘日’ で終わるカラム名を取得
ends_with_日 = df.columns.str.endswith(‘日’)
columns_ending_日 = df.columns[ends_with_日]
print(“\n— ‘日’で終わるカラム名 —“)
print(columns_ending_日.tolist())
“`
出力例:
--- '日'で終わるカラム名 ---
['最終更新日']
6.1.4 正規表現を用いた抽出 (str.contains()
の応用)
.str.contains()
はデフォルトで正規表現パターンとして解釈されるため、より複雑なパターンマッチングが可能です。
“`python
例: ‘ID’ または ‘数’ を含むカラム名を取得
regex_id_or_num = df.columns.str.contains(‘ID|数’)
columns_id_or_num = df.columns[regex_id_or_num]
print(“\n— ‘ID’ または ‘数’ を含むカラム名 —“)
print(columns_id_or_num.tolist())
“`
出力例:
--- 'ID' または '数' を含むカラム名 ---
['商品ID', '在庫数']
6.1.5 .filter()
メソッドの使用
Pandas DataFrameオブジェクトには、ラベル(インデックスやカラム名)に基づいてフィルタリングを行うための.filter()
メソッドが用意されています。このメソッドを使うと、items
、like
、regex
といった引数を用いてカラム名を抽出できます。これは、.columns
属性と文字列操作を組み合わせるよりも直感的かもしれません。
items
: 完全に一致するカラム名のリストを指定します。like
: 特定の文字列を含むカラム名を抽出します(部分一致)。大文字・小文字を区別します。regex
: 正規表現パターンに一致するカラム名を抽出します。
“`python
例: ‘価格’ と ‘評価’ カラムのみを取得 (itemsを使用)
filtered_by_items = df.filter(items=[‘価格’, ‘評価’]).columns
print(“\n— items で指定したカラム名 —“)
print(filtered_by_items.tolist())
例: ‘数’ を含むカラム名を取得 (likeを使用)
filtered_by_like = df.filter(like=’数’).columns
print(“\n— like で指定したカラム名 (‘数’を含む) —“)
print(filtered_by_like.tolist())
例: 正規表現 ‘^商品’ に一致するカラム名を取得 (regexを使用)
filtered_by_regex = df.filter(regex=’^商品’).columns
print(“\n— regex で指定したカラム名 (‘^商品’に一致) —“)
print(filtered_by_regex.tolist())
“`
出力例:
“`
— items で指定したカラム名 —
[‘価格’, ‘評価’]
— like で指定したカラム名 (‘数’を含む) —
[‘在庫数’]
— regex で指定したカラム名 (‘^商品’に一致) —
[‘商品ID’, ‘商品名’]
“`
.filter()
メソッドは、カラム名を取得するだけでなく、そのままフィルタリングされたDataFrameを返す点に注意が必要です。上記の例では、カラム名だけを取得するために .columns
を続けて呼び出しています。
6.2 データ型に基づく抽出
DataFrameに含まれる様々なデータ型の列の中から、特定の型のカラム名だけを取得したい場合があります。例えば、数値型の列だけを選んで統計計算を行いたい、文字列型の列だけを抽出してテキスト分析を行いたい、といったケースです。Pandasには、データ型に基づいて列を選択するための.select_dtypes()
メソッドがあります。
.select_dtypes()
メソッドは、DataFrame自体から指定したデータ型の列を選択して新しいDataFrameを返すメソッドですが、その結果のDataFrameに対して.columns
属性を使えば、目的のデータ型のカラム名一覧が得られます。
引数として include
または exclude
を指定し、データ型(または型のリスト)を渡します。データ型は 'number'
, 'object'
, 'datetime'
, 'boolean'
, 'category'
などの文字列で指定できます。あるいは、NumPyのdtypeオブジェクト(例: np.int64
, np.float64
)やPythonの型(例: int
, float
, object
, bool
, datetime64
)を指定することも可能です。
“`python
例: 数値型のカラム名を取得
numeric_columns = df.select_dtypes(include=[‘number’]).columns
print(“— 数値型のカラム名 —“)
print(numeric_columns.tolist())
例: オブジェクト型(文字列など)のカラム名を取得
object_columns = df.select_dtypes(include=[‘object’]).columns
print(“\n— オブジェクト型のカラム名 —“)
print(object_columns.tolist())
例: 日付/時刻型のカラム名を取得
datetime_columns = df.select_dtypes(include=[‘datetime’]).columns
print(“\n— 日付/時刻型のカラム名 —“)
print(datetime_columns.tolist())
例: 数値型とブール型以外のカラム名を取得
non_numeric_or_bool_columns = df.select_dtypes(exclude=[‘number’, ‘bool’]).columns
print(“\n— 数値型とブール型以外のカラム名 —“)
print(non_numeric_or_bool_columns.tolist())
“`
出力例:
“`
— 数値型のカラム名 —
[‘商品ID’, ‘価格’, ‘在庫数’, ‘評価’]
— オブジェクト型のカラム名 —
[‘商品名’]
— 日付/時刻型のカラム名 —
[‘最終更新日’]
— 数値型とブール型以外のカラム名 —
[‘商品名’, ‘最終更新日’]
“`
.select_dtypes()
は、データ型の正確な種類(int64
, float64
など)を指定するよりも、一般的なカテゴリ名('number'
, 'object'
など)で指定する方が柔軟性があり、通常推奨されます。
6.3 欠損値の数に基づく抽出
特定の条件(例えば、欠損値の数が多いなど)を満たすカラム名を取得したい場合もあります。これには、欠損値の数を計算する.isnull().sum()
メソッドと、その結果を利用した条件指定を組み合わせます。
“`python
各カラムの欠損値の数を計算
missing_counts = df.isnull().sum()
print(“— 各カラムの欠損値数 —“)
print(missing_counts)
例: 欠損値が1つ以上あるカラム名を取得
columns_with_missing = missing_counts[missing_counts > 0].index
print(“\n— 欠損値があるカラム名 —“)
print(columns_with_missing.tolist())
例: 欠損値が0個(つまり欠損値がない)カラム名を取得
columns_without_missing = missing_counts[missing_counts == 0].index
print(“\n— 欠損値がないカラム名 —“)
print(columns_without_missing.tolist())
“`
出力例:
“`
— 各カラムの欠損値数 —
商品ID 0
商品名 0
価格 0
在庫数 0
最終更新日 0
割引適用 0
評価 1
dtype: int64
— 欠損値があるカラム名 —
[‘評価’]
— 欠損値がないカラム名 —
[‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’]
“`
この方法では、まず.isnull().sum()
で各カラムの欠損値数をSeriesとして取得し、次にそのSeriesに対して条件(例: missing_counts > 0
)を指定して、条件を満たすカラムのインデックス(カラム名)を取得します。
6.4 ユニークな値の数に基づく抽出
カテゴリカル変数や低カーディナリティ(ユニークな値の種類が少ない)の特徴量を見つけるために、ユニークな値の数に基づいてカラム名を抽出することがあります。これには.nunique()
メソッドを使用します。
“`python
各カラムのユニークな値の数を計算
unique_counts = df.nunique()
print(“— 各カラムのユニークな値の数 —“)
print(unique_counts)
例: ユニークな値の数が5未満のカラム名を取得 (カテゴリカル候補)
columns_low_cardinality = unique_counts[unique_counts < 5].index
print(“\n— ユニークな値が5未満のカラム名 —“)
print(columns_low_cardinality.tolist())
例: ユニークな値の数が全行数と等しいカラム名を取得 (ID候補)
columns_high_cardinality = unique_counts[unique_counts == len(df)].index
print(“\n— ユニークな値が全行数と等しいカラム名 —“)
print(columns_high_cardinality.tolist())
“`
出力例:
“`
— 各カラムのユニークな値の数 —
商品ID 5
商品名 5
価格 5
在庫数 5
最終更新日 3
割引適用 2
評価 4
dtype: int64
— ユニークな値が5未満のカラム名 —
[‘最終更新日’, ‘割引適用’, ‘評価’]
— ユニークな値が全行数と等しいカラム名 —
[‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’]
“`
.nunique()
は、デフォルトでは欠損値(NaN)をカウントしません。欠損値をカウントに含めたい場合は dropna=False
を指定します。条件抽出の方法は、データの内容や分析の目的に応じて様々に応用できます。
7. DataFrameが空の場合のカラム名取得
DataFrameが空、つまり行が一つも含まれていない場合があります。このような空のDataFrameに対しても.columns
属性はエラーを起こさずに機能します。
空のDataFrameを作成してみましょう。
“`python
空のDataFrameを作成
empty_df = pd.DataFrame(columns=[‘商品ID’, ‘商品名’, ‘価格’]) # カラム名だけを指定
print(“\n— 空のDataFrame —“)
print(empty_df)
空のDataFrameのカラム名を取得
empty_columns = empty_df.columns
print(“\n— 空のDataFrameのdf.columnsの結果 —“)
print(empty_columns)
print(“\n— 空のDataFrameのdf.columns.tolist()の結果 —“)
print(empty_columns.tolist())
“`
出力例:
“`
— 空のDataFrame —
Empty DataFrame
Columns: [商品ID, 商品名, 価格]
Index: []
— 空のDataFrameのdf.columnsの結果 —
Index([‘商品ID’, ‘商品名’, ‘価格’], dtype=’object’)
— 空のDataFrameのdf.columns.tolist()の結果 —
[‘商品ID’, ‘商品名’, ‘価格’]
“`
DataFrameが空であっても、カラム情報自体は保持されています。.columns
は空のIndexオブジェクトではなく、定義されているカラム名を持つIndexオブジェクトを返します。これは、後からデータを追加したり、空の状態であらかじめカラム構造を定義したりする場合に便利です。もしカラムも定義されていない完全に空のDataFrame(pd.DataFrame()
)であれば、Index([], dtype='object')
のような空のIndexが返されます。
8. MultiIndex(階層型インデックス)のカラム名取得
Pandas DataFrameは、行インデックス(index
)や列インデックス(columns
)に複数のレベルを持つMultiIndex(階層型インデックス)を使用できます。これは、階層的なデータを表現するのに便利です。MultiIndexを持つDataFrameの場合、.columns
属性はMultiIndex
オブジェクトを返します。
MultiIndexを持つDataFrameの例を作成します。
“`python
MultiIndexを持つDataFrameを作成
header = pd.MultiIndex.from_product([[‘販売データ’, ‘在庫情報’],
[‘数量’, ‘金額’]],
names=[‘カテゴリ’, ‘項目’])
data_multi = np.random.randint(1, 100, size=(3, 4))
df_multi = pd.DataFrame(data_multi, columns=header)
print(“\n— MultiIndexを持つDataFrame —“)
print(df_multi)
“`
出力例:
--- MultiIndexを持つDataFrame ---
カテゴリ 販売データ 在庫情報
項目 数量 金額 数量 金額
0 70 35 42 32
1 22 21 48 14
2 42 60 85 91
このDataFrame df_multi
のカラムはMultiIndexになっています。「販売データ」「在庫情報」がレベル0、「数量」「金額」がレベル1です。
8.1 .columns
属性の結果
MultiIndexを持つDataFrameで.columns
属性を使用すると、MultiIndex
オブジェクトが返されます。
“`python
MultiIndexを持つDataFrameのカラム名を取得
multi_columns = df_multi.columns
print(“\n— MultiIndexを持つDataFrameのdf.columnsの結果 —“)
print(multi_columns)
取得したオブジェクトの型を確認
print(“\n— MultiIndexを持つDataFrameのdf.columnsの型 —“)
print(type(multi_columns))
“`
出力例:
“`
— MultiIndexを持つDataFrameのdf.columnsの結果 —
MultiIndex([(‘販売データ’, ‘数量’),
(‘販売データ’, ‘金額’),
(‘在庫情報’, ‘数量’),
(‘在庫情報’, ‘金額’)],
names=[‘カテゴリ’, ‘項目’])
— MultiIndexを持つDataFrameのdf.columnsの型 —
“`
MultiIndexオブジェクトは、各カラムがタプルとして表現され、そのタプルが各レベルのラベルを含んでいます。
8.2 各レベルのカラム名を取得する (.get_level_values()
)
MultiIndexから特定のレベルのカラム名のみを取得したい場合は、.get_level_values()
メソッドを使用します。引数にはレベルの番号(0から始まる)またはレベル名を指定します。
“`python
レベル0(カテゴリ)のカラム名を取得
level_0_columns = df_multi.columns.get_level_values(0)
print(“\n— レベル0(カテゴリ)のカラム名 —“)
print(level_0_columns)
レベル1(項目)のカラム名を取得
level_1_columns = df_multi.columns.get_level_values(‘項目’) # レベル名でも指定可能
print(“\n— レベル1(項目)のカラム名 —“)
print(level_1_columns)
“`
出力例:
“`
— レベル0(カテゴリ)のカラム名 —
Index([‘販売データ’, ‘販売データ’, ‘在庫情報’, ‘在庫情報’], dtype=’object’, name=’カテゴリ’)
— レベル1(項目)のカラム名 —
Index([‘数量’, ‘金額’, ‘数量’, ‘金額’], dtype=’object’, name=’項目’)
“`
これらのメソッドもIndexオブジェクト(今回は通常のIndex)を返しますので、必要に応じて.tolist()
でリストに変換できます。
“`python
print(“\n— レベル0(カテゴリ)のカラム名 (リスト) —“)
print(level_0_columns.tolist())
print(“\n— レベル1(項目)のカラム名 (リスト) —“)
print(level_1_columns.tolist())
“`
出力例:
“`
— レベル0(カテゴリ)のカラム名 (リスト) —
[‘販売データ’, ‘販売データ’, ‘在庫情報’, ‘在庫情報’]
— レベル1(項目)のカラム名 (リスト) —
[‘数量’, ‘金額’, ‘数量’, ‘金額’]
“`
ご覧のように、同じレベルのラベルが複数回出現することがあります(例:「販売データ」が2回、「在庫情報」が2回、「数量」が2回、「金額」が2回)。これは、MultiIndexの構造を反映しています。
8.3 MultiIndexをフラット化してリストにする方法
MultiIndexのカラム名を単一のレベルのリストとして扱いたい場合は、タプル形式のままリストに変換するのが一般的です。.columns.tolist()
は、MultiIndexの場合もタプルのリストを返します。
“`python
MultiIndexカラム名をタプルのリストとして取得
multi_columns_list = df_multi.columns.tolist()
print(“\n— MultiIndexカラム名 (タプルのリスト) —“)
print(multi_columns_list)
“`
出力例:
--- MultiIndexカラム名 (タプルのリスト) ---
[('販売データ', '数量'), ('販売データ', '金額'), ('在庫情報', '数量'), ('在庫情報', '金額')]
もし、これらのタプル形式のカラム名を、例えば '販売データ_数量'
, '販売データ_金額'
のように、一つの文字列に結合して扱いたい場合は、リスト内包表記などを使って変換します。
“`python
MultiIndexカラム名をフラットな文字列リストに変換
flattened_columns = [‘_’.join(col) for col in df_multi.columns]
print(“\n— フラット化されたカラム名 (文字列リスト) —“)
print(flattened_columns)
“`
出力例:
--- フラット化されたカラム名 (文字列リスト) ---
['販売データ_数量', '販売データ_金額', '在庫情報_数量', '在庫情報_金額']
このように、MultiIndexのカラム名を取得する方法は、その目的(階層構造を維持したいのか、特定のレベルだけ見たいのか、フラットなリストとして扱いたいのか)によって選択します。
9. 大規模データセットにおけるカラム名取得のパフォーマンス
Pandasは大量のデータを効率的に処理できるように設計されています。DataFrameのカラム名を取得する操作(.columns
属性へのアクセスや.tolist()
, .to_numpy()
による変換)は、データの内容ではなく、DataFrameの構造に関する情報を取得する操作です。
データ構造の情報は、DataFrameオブジェクト自体に格納されており、データの量(行数)に依存しません。したがって、たとえDataFrameが数百万行、数千万行といった大規模なデータを含んでいても、.columns
属性の取得や、それをリスト/NumPy配列に変換する操作は非常に高速に完了します。
例として、非常に大きなDataFrameを作成してカラム名取得にかかる時間を計測してみましょう。
“`python
import time
大規模なDataFrameを作成 (100万行 x 100列)
large_data = pd.DataFrame(np.random.rand(1000000, 100))
カラム名はデフォルトで0から99の整数インデックスになります
便宜上、文字列のカラム名を付けます
large_data.columns = [f’column_{i}’ for i in range(100)]
print(“\n— 大規模DataFrameのカラム名取得 —“)
start_time = time.time()
large_columns_index = large_data.columns
end_time = time.time()
print(f”.columns 属性の取得時間: {end_time – start_time:.6f} 秒”)
start_time = time.time()
large_columns_list = large_data.columns.tolist()
end_time = time.time()
print(f”.columns.tolist() の取得時間: {end_time – start_time:.6f} 秒”)
start_time = time.time()
large_columns_array = large_data.columns.to_numpy()
end_time = time.time()
print(f”.columns.to_numpy() の取得時間: {end_time – start_time:.6f} 秒”)
確認のために最初の10個のカラム名を表示
print(“\n— 大規模DataFrameの最初の10個のカラム名 —“)
print(large_columns_list[:10])
“`
出力例 (実行環境によって時間は変動します):
“`
— 大規模DataFrameのカラム名取得 —
.columns 属性の取得時間: 0.000015 秒
.columns.tolist() の取得時間: 0.000025 秒
.columns.to_numpy() の取得時間: 0.000030 秒
— 大規模DataFrameの最初の10個のカラム名 —
[‘column_0’, ‘column_1’, ‘column_2’, ‘column_3’, ‘column_4’, ‘column_5’, ‘column_6’, ‘column_7’, ‘column_8’, ‘column_9’]
“`
この結果からも分かるように、100万行、100列という比較的大きなDataFrameであっても、カラム名を取得する操作はミリ秒どころかマイクロ秒のオーダーで完了しており、データ規模による実行時間の増加は無視できるほど小さいです。これは、カラム名がDataFrameのメタデータの一部として効率的に管理されているためです。したがって、パフォーマンスについて心配することなく、必要に応じていつでもカラム名を取得して利用できます。
10. 取得したカラム名を活用する方法
取得したカラム名の一覧は、その後のデータ分析や操作で頻繁に利用されます。ここでは、カラム名リストの代表的な活用方法をいくつか紹介します。
10.1 特定カラムの選択
取得したカラム名リストや一部のカラム名を使って、DataFrameから特定の列だけを選択できます。リストを使って複数の列を選択する場合、DataFrameのインデックス演算子 []
にリストを渡します。
“`python
例: カラム名リストから特定の列を選択
selected_columns = [‘商品名’, ‘価格’, ‘在庫数’]
df_subset = df[selected_columns]
print(“— 選択したカラム —“)
print(df_subset)
“`
出力例:
--- 選択したカラム ---
商品名 価格 在庫数
0 りんご 120 50
1 バナナ 80 120
2 みかん 150 80
3 ぶどう 300 30
4 もも 250 60
条件抽出で取得したカラム名リストをそのまま使うこともできます。
“`python
例: 数値型のカラムだけを選択
numeric_cols = df.select_dtypes(include=[‘number’]).columns.tolist()
df_numeric = df[numeric_cols]
print(“\n— 数値型のカラムのみ —“)
print(df_numeric)
“`
出力例:
--- 数値型のカラムのみ ---
商品ID 価格 在庫数 評価
0 101 120 50 4.5
1 102 80 120 3.8
2 103 150 80 NaN
3 104 300 30 4.9
4 105 250 60 4.2
10.2 カラムのリネーム
カラム名を変更したい場合、取得したカラム名リストを使って現在の名前を確認したり、新しい名前のリストと関連付けたりすることができます。最も一般的なリネーム方法は.rename()
メソッドですが、DataFrameの.columns
属性に直接新しいカラム名のリストを代入することも可能です(ただし、代入する場合はリストの長さが現在のカラム数と一致している必要があります)。
“`python
例: 特定のカラム名をリネーム
df_renamed = df.rename(columns={‘商品ID’: ‘Product_ID’, ‘商品名’: ‘Product_Name’, ‘価格’: ‘Price’})
print(“— カラム名をリネームしたDataFrame —“)
print(df_renamed.columns.tolist()) # リネーム後のカラム名を確認
print(df_renamed)
“`
出力例:
--- カラム名をリネームしたDataFrame ---
['Product_ID', 'Product_Name', 'Price', '在庫数', '最終更新日', '割引適用', '評価']
--- カラム名をリネームしたDataFrame ---
Product_ID Product_Name Price 在庫数 最終更新日 割引適用 評価
0 101 りんご 120 50 2023-10-01 True 4.5
1 102 バナナ 80 120 2023-10-02 False 3.8
2 103 みかん 150 80 2023-10-01 True NaN
3 104 ぶどう 300 30 2023-10-03 False 4.9
4 105 もも 250 60 2023-10-02 True 4.2
.columns
属性に直接代入する方法:
“`python
例: 全てのカラム名を新しいリストで置き換え
new_column_names = [‘col_a’, ‘col_b’, ‘col_c’, ‘col_d’, ‘col_e’, ‘col_f’, ‘col_g’]
元のdfのカラム数と新しいリストの長さが一致しているか確認
if len(new_column_names) == len(df.columns):
df_reassigned_cols = df.copy() # 元のdfを変更しないようにコピー
df_reassigned_cols.columns = new_column_names
print(“\n— カラム名リストを直接代入して変更したDataFrame —“)
print(df_reassigned_cols.columns.tolist())
print(df_reassigned_cols)
else:
print(“エラー: 新しいカラム名のリストの長さがDataFrameのカラム数と一致しません。”)
“`
出力例:
--- カラム名リストを直接代入して変更したDataFrame ---
['col_a', 'col_b', 'col_c', 'col_d', 'col_e', 'col_f', 'col_g']
col_a col_b col_c col_d col_e col_f col_g
0 101 りんご 120 50 2023-10-01 True 4.5
1 102 バナナ 80 120 2023-10-02 False 3.8
2 103 みかん 150 80 2023-10-01 True NaN
3 104 ぶどう 300 30 2023-10-03 False 4.9
4 105 もも 250 60 2023-10-02 True 4.2
.rename()
メソッドの方が、元のDataFrameを保持しつつ特定の部分だけを変更できるため、より安全で推奨される方法です。
10.3 不要なカラムの削除
取得したカラム名リストから不要なカラムを特定し、.drop()
メソッドを使って削除することができます。
“`python
例: ‘割引適用’ カラムを削除
columns_to_drop = [‘割引適用’]
df_dropped = df.drop(columns=columns_to_drop) # columns引数で列を指定
print(“— ‘割引適用’ カラムを削除したDataFrame —“)
print(df_dropped.columns.tolist())
print(df_dropped)
“`
出力例:
--- '割引適用' カラムを削除したDataFrame ---
['商品ID', '商品名', '価格', '在庫数', '最終更新日', '評価']
商品ID 商品名 価格 在庫数 最終更新日 評価
0 101 りんご 120 50 2023-10-01 4.5
1 102 バナナ 80 120 2023-10-02 3.8
2 103 みかん 150 80 2023-10-01 NaN
3 104 ぶどう 300 30 2023-10-03 4.9
4 105 もも 250 60 2023-10-02 4.2
複数のカラムを削除したい場合は、削除したいカラム名のリストをcolumns
引数に渡します。axis=1
を指定することで列方向の削除であることを明示することも推奨されます(デフォルトはaxis=0
で行の削除)。
10.4 カラムの順序変更
取得したカラム名リストを並べ替えたり、特定の順序の新しいリストを作成したりすることで、DataFrameの列の順序を変更できます。DataFrameのインデックス演算子 []
に、新しい順序で並べ替えたカラム名リストを渡すことで実現できます。
“`python
例: カラムの順序を変更 (‘商品名’, ‘商品ID’, ‘価格’, …)
current_columns = df.columns.tolist()
new_order = [‘商品名’, ‘商品ID’, ‘価格’, ‘在庫数’, ‘評価’, ‘割引適用’, ‘最終更新日’] # 新しい順序のリスト
リストを使ってカラムを選択し、新しいDataFrameを作成
df_reordered = df[new_order]
print(“— カラムの順序を変更したDataFrame —“)
print(df_reordered.columns.tolist())
print(df_reordered)
“`
出力例:
--- カラムの順序を変更したDataFrame ---
['商品名', '商品ID', '価格', '在庫数', '評価', '割引適用', '最終更新日']
商品名 商品ID 価格 在庫数 評価 割引適用 最終更新日
0 りんご 101 120 50 4.5 True 2023-10-01
1 バナナ 102 80 120 3.8 False 2023-10-02
2 みかん 103 150 80 NaN True 2023-10-01
3 ぶどう 104 300 30 4.9 False 2022-10-03
4 もも 105 250 60 4.2 True 2022-10-02
10.5 ループ処理での利用
カラム名リストを使って、各カラムに対して繰り返し処理を行うことができます。例えば、各カラムのデータ型を確認したり、簡単な統計情報を表示したりする際に便利です。
“`python
例: 各カラムのデータ型を表示
print(“\n— 各カラムのデータ型 —“)
for col in df.columns:
print(f”カラム ‘{col}’: データ型 = {df[col].dtype}”)
“`
出力例:
--- 各カラムのデータ型 ---
カラム '商品ID': データ型 = int64
カラム '商品名': データ型 = object
カラム '価格': データ型 = int64
カラム '在庫数': データ型 = int64
カラム '最終更新日': データ型 = datetime64[ns]
カラム '割引適用': データ型 = bool
カラム '評価': データ型 = float64
10.6 可視化における利用
データの可視化を行う際にも、カラム名リストは頻繁に使用されます。例えば、特定のカラムを選択してプロットを作成したり、複数のカラム名をリストとして可視化関数に渡したりします。
“`python
例: 数値型カラムのヒストグラムをまとめて描画 (matplotlib/seabornが必要)
import matplotlib.pyplot as plt
import seaborn as sns
numeric_cols = df.select_dtypes(include=[‘number’]).columns.tolist()
print(“\n— 数値型カラムのヒストグラム描画 (例) —“)
df[numeric_cols].hist(figsize=(10, 8))
plt.tight_layout()
plt.show()
“`
このように、取得したカラム名リストは、Pandasを使ったデータ操作や分析の様々な場面で非常に役立ちます。
11. カラム名取得に関する注意点
カラム名の取得と操作を行う際には、いくつかの注意点があります。
11.1 大文字・小文字の区別
Pandasのカラム名は大文字・小文字を区別します。例えば、df['商品名']
と df['商品めい']
は全く別のカラムとして扱われます。カラム名を手入力したり、比較したりする場合は、正確な表記(大文字・小文字、全角/半角など)を確認する必要があります。
カラム名一覧を取得し、それを使って操作を行うことで、スペルミスや大文字・小文字の違いによるエラーを防ぐことができます。例えば、ユーザー入力からカラム名を指定する場合などは、入力された文字列と実際にあるカラム名を比較したり、大文字・小文字を統一したりする処理が必要になることがあります。
“`python
例: カラム名の大文字・小文字の区別
try:
print(df[‘商品めい’])
except KeyError as e:
print(f”\nエラーが発生しました: {e}”)
カラム名一覧を確認して正確な名前を使用
print(“\n正確なカラム名:”, df.columns.tolist())
print(df[‘商品名’]) # 正確な名前なら成功
“`
出力例:
“`
エラーが発生しました: “[‘商品めい’] not in index”
正確なカラム名: [‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
0 りんご
1 バナナ
2 みかん
3 ぶどう
4 もも
Name: 商品名, dtype: object
“`
11.2 空白や特殊文字を含むカラム名
カラム名に空白文字や特殊文字(例: #
, $
, -
, .
など)が含まれている場合があります。このようなカラム名を持つDataFrameを扱う際には注意が必要です。
通常、カラム名には文字列としてアクセスするため、空白や特殊文字が含まれていても問題なく取得・使用できます。しかし、属性アクセス(例: df.column_name
)は使用できません。
“`python
特殊文字を含むカラム名を持つDataFrameの例
df_special_cols = pd.DataFrame({
‘商品 ID’: [101, 102],
‘価格 ($)’: [120, 80],
‘在庫-数’: [50, 120]
})
print(“\n— 特殊文字を含むカラム名を持つDataFrame —“)
print(df_special_cols)
.columns でカラム名を取得
print(“\n— df_special_cols.columns —“)
print(df_special_cols.columns.tolist())
[] を使ってカラムにアクセス (問題なし)
print(“\n— df_special_cols[‘価格 ($)’] —“)
print(df_special_cols[‘価格 ($)’])
属性アクセスを試みる (エラーになる)
try:
print(df_special_cols.価格 ($)) # シンタックスエラー
except SyntaxError as e:
print(f”\n属性アクセスでのエラー (SyntaxError): {e}”)
属性アクセスを試みる (空白が含まれている場合)
try:
print(df_special_cols.商品 ID) # シンタックスエラー
except SyntaxError as e:
print(f”属性アクセスでのエラー (空白 SyntaxError): {e}”)
“`
出力例:
“`
— 特殊文字を含むカラム名を持つDataFrame —
商品 ID 価格 ($) 在庫-数
0 101 120 50
1 102 80 120
— df_special_cols.columns —
[‘商品 ID’, ‘価格 ($)’, ‘在庫-数’]
— df_special_cols[‘価格 ($)’] —
0 120
1 80
Name: 価格 ($), dtype: int64
属性アクセスでのエラー (SyntaxError): invalid syntax (
属性アクセスでのエラー (空白 SyntaxError): invalid syntax (
“`
空白や特殊文字を含むカラム名は、属性アクセスが使えないため、常に[]
を使ってアクセスする必要があります。コードの可読性や扱いやすさを考えると、データ取り込み時や初期段階でこれらのカラム名をより一般的な、属性アクセス可能な名前にリネームすることが推奨されます。
11.3 カラム名の変更とDataFrameの immutability
Pandasの多くの操作は、元のDataFrameを変更せず、新しいDataFrameを返します(”immutable”ではありませんが、変更を伴う操作はコピーを返すことが多いです)。しかし、カラム名の変更に関しては少し異なる挙動を示す場合があります。
.rename()
メソッドは、デフォルトでは新しいDataFrameを返します。元のDataFrameを変更したい場合はinplace=True
引数を指定します(ただし、inplace=True
は推奨されなくなりつつあります)。.columns
属性に直接リストを代入する場合、これは元のDataFrameのカラム名をその場で(inplace)変更します。
“`python
元のDataFrame
print(“— 元のDataFrameのカラム名 —“)
print(df.columns.tolist())
.rename() を使う (inplace=Falseがデフォルト)
df_renamed_new = df.rename(columns={‘商品ID’: ‘ProductID_New’})
print(“\n— .rename() (新しいDataFrame) のカラム名 —“)
print(df_renamed_new.columns.tolist())
print(“元のDataFrameのカラム名 (変更なし):”, df.columns.tolist())
.columns に直接代入 (元のDataFrameを変更)
注意: 列の数が一致している必要があります
df_assign_cols = df.copy() # 変更の影響を示すためコピーを作成
original_cols_copy = df_assign_cols.columns.tolist() # 変更前のカラム名を保存
new_cols_list = [f’Column_{i+1}’ for i in range(len(df_assign_cols.columns))]
df_assign_cols.columns = new_cols_list
print(“\n— .columns に直接代入したDataFrameのカラム名 —“)
print(df_assign_cols.columns.tolist())
print(“元のDataFrameのカラム名 (コピー元は変更なし):”, df.columns.tolist())
print(“直接代入で変更したコピーの元カラム名:”, original_cols_copy)
“`
出力例:
“`
— 元のDataFrameのカラム名 —
[‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
— .rename() (新しいDataFrame) のカラム名 —
[‘ProductID_New’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
元のDataFrameのカラム名 (変更なし): [‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
— .columns に直接代入したDataFrameのカラム名 —
[‘Column_1’, ‘Column_2’, ‘Column_3’, ‘Column_4’, ‘Column_5’, ‘Column_6’, ‘Column_7’]
元のDataFrameのカラム名 (コピー元は変更なし): [‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
直接代入で変更したコピーの元カラム名: [‘商品ID’, ‘商品名’, ‘価格’, ‘在庫数’, ‘最終更新日’, ‘割引適用’, ‘評価’]
“`
この例からわかるように、.columns = [...]
という代入操作は、そのDataFrameオブジェクト自体を直接変更します。これは効率的ですが、意図しない副作用を避けるために、元のDataFrameを残しておきたい場合はcopy()
してから代入を行うように注意が必要です。
11.4 データソースによるカラム名の差異
PandasでCSVやデータベースなどからデータを読み込む際、カラム名がデータソースによって異なる形式で付与されることがあります。
- CSVファイル: ヘッダー行が存在する場合、それがカラム名として使用されます。エンコーディングの問題でカラム名が文字化けすることもあります。
- データベース: テーブルのカラム名がそのまま使用されます。
- JSON/API: データの構造に応じて、キーがカラム名になることが多いですが、複雑なネスト構造の場合は前処理が必要になることがあります。
データを読み込んだ直後にまず.columns
でカラム名一覧を確認し、期待通りの名前になっているかチェックする習慣をつけると良いでしょう。必要であれば、前述の.rename()
メソッドなどで整形を行います。
11.5 エンコーディングの問題
CSVファイルなどを読み込む際に、ファイル自身のエンコーディングとPandasが読み込む際のエンコーディング指定が一致しない場合、特に日本語などのマルチバイト文字を含むカラム名が正しく読み込まれず、文字化けしてしまうことがあります。
“`python
例: UTF-8で日本語を含むCSVを読み込む
適当なCSVファイルを作成(例: sample.csv)
内容:
商品ID,商品名,価格
1,りんご,100
2,バナナ,200
sample.csvをUTF-8で保存したものとして読み込む
try:
df_csv = pd.read_csv(‘sample.csv’, encoding=’utf-8′)
print(“\n— CSVファイルから読み込んだDataFrameのカラム名 —“)
print(df_csv.columns.tolist())
except FileNotFoundError:
print(“\nsample.csv が見つかりませんでした。”)
except Exception as e:
print(f”\nCSV読み込みエラー: {e}”)
もしエンコーディングが異なる場合(例: shift_jisで保存されているのにutf-8で読むと文字化け)
try:
df_csv_bad_encoding = pd.read_csv(‘sample_shift_jis.csv’, encoding=’utf-8′)
print(“\n— エンコーディング間違いで読み込んだカラム名 (文字化けの可能性) —“)
print(df_csv_bad_encoding.columns.tolist())
except FileNotFoundError:
pass # ファイルがない場合はスキップ
except Exception as e:
print(f”\nCSV読み込みエラー (エンコーディング違い): {e}”)
“`
CSVファイルを読み込む際は、.read_csv()
関数のencoding
引数に正しいエンコーディングを指定することが重要です。これにより、カラム名を含めたデータ全体が正しく読み込まれます。
12. まとめ
この記事では、Pandas DataFrameのカラム名一覧を取得するための様々な方法を、詳細な説明とコード例を交えて解説しました。
- 最も基本的な取得: DataFrameオブジェクトの
.columns
属性にアクセスします。これはpandas.Index
オブジェクトを返します。 - リストとしての取得:
df.columns.tolist()
またはlist(df.columns)
を使用して、カラム名をPythonのリストとして取得できます。.tolist()
が一般的です。 - NumPy配列としての取得:
df.columns.values
またはdf.columns.to_numpy()
を使用して、カラム名をNumPy配列として取得できます。.to_numpy()
が推奨されます。 - 条件に基づく抽出: 文字列操作(
.str.contains()
,.str.startswith()
,.str.endswith()
)や、.filter()
メソッド、データ型(.select_dtypes()
)、欠損値やユニーク数の集計結果などを利用して、特定の条件を満たすカラム名を選択できます。 - 空のDataFrame: 空のDataFrameでも
.columns
属性は機能し、定義されたカラム名(または空のIndex)を返します。 - MultiIndexの場合: MultiIndexを持つDataFrameでは、
.columns
はMultiIndex
オブジェクトを返します。.get_level_values()
で各レベルのカラム名を取得したり、.tolist()
でタプルのリストとして取得したり、リスト内包表記でフラットなリストに変換したりできます。 - パフォーマンス:
.columns
属性の取得は、データ量に依存せず高速です。 - 活用方法: 取得したカラム名リストは、カラムの選択、リネーム、削除、順序変更、ループ処理、可視化など、データ分析の様々な場面で活用されます。
- 注意点: カラム名の大文字・小文字の区別、空白や特殊文字の扱い、カラム名変更のインプレース性、データソースによる差異、エンコーディング問題などに注意が必要です。
Pandas DataFrameを扱う上で、カラム名の取得と管理は基本的ながら非常に重要なスキルです。これらの方法を理解し、状況に応じて適切に使い分けることで、より効率的で正確なデータ分析を行うことができるでしょう。公式ドキュメントも参考にしながら、さらにPandasの機能を活用してみてください。