【Pandas操作術】DataFrameの行番号・列番号を自在に取得するテクニック
データ分析の際、Pandas DataFrameの特定のデータにアクセスしたり、条件に基づいて操作したりする場合に、そのデータの**「位置」、つまり行番号(インデックス)や列番号(カラム名/位置インデックス)**を知ることは非常に重要です。特に、繰り返し処理や条件分岐、あるいは特定の位置にある値の取得などで、これらの情報を効率的に利用したい場面が頻繁にあります。
Pandasは、DataFrameから行番号や列番号、あるいはそれらに関連する情報を取得するための複数の方法を提供しています。この記事では、DataFrameの行番号、列番号(または列名)を取得する主要なテクニックを、短いサンプルコードと丁寧な解説を交えてご紹介します。
行番号・列番号とは?なぜ位置情報が必要なのか?
DataFrameにおける「行番号」とは、通常、行のインデックス(index属性)を指します。これは必ずしも連番とは限りません。一方、「列番号」は列名(columns属性)を指すことが多く、位置的な番号(0から始まる整数)を指すこともあります。
なぜこれらの位置情報が必要なのでしょうか?
-
特定のデータへのアクセス: 特定の行や列に絞ってデータを抽出したり、値を更新したりする場合に、位置情報がキーとなります。
-
繰り返し処理: DataFrameをループ処理する際に、現在の行や列のインデックスを取得して利用したい場合があります。
-
条件による選択: 特定の条件を満たす行や列のインデックスを取得し、その後の処理に役立てます。
-
デバッグと検証: データの問題箇所を特定する際に、その位置(行番号、列番号)を知ることが重要です。
1. DataFrameのインデックス(行ラベル)を取得する
DataFrameの行には、それぞれユニークなラベルが付けられています。これが「インデックス」です。
df.indexでインデックス(行ラベル)を取得
DataFrameのindex属性にアクセスすることで、全ての行インデックスのリストのようなオブジェクト(Indexオブジェクト)を取得できます。
import pandas as pd
# サンプルDataFrameの作成
df = pd.DataFrame({
'商品': ['A', 'B', 'C', 'D'],
'売上': [100, 150, 120, 80]
}, index=['Q1_2023', 'Q2_2023', 'Q3_2023', 'Q4_2023']) # カスタムインデックス
print("オリジナルDataFrame:\n", df)
# DataFrameの行インデックスを取得
row_indexes = df.index
print("\n行インデックス:\n", row_indexes)
print("データ型:", type(row_indexes))
解説:
df.indexはpd.Indexオブジェクトを返します。これはリストのように反復可能で、各行のラベルが含まれています。デフォルトの数値インデックス(0, 1, 2…)の場合も同様です。
df.index.to_list()でPythonのリストに変換
インデックスを標準のPythonリストとして扱いたい場合は、.to_list()メソッドを使用します。
# 行インデックスをPythonリストに変換
row_indexes_list = df.index.to_list()
print("\n行インデックス (リスト形式):\n", row_indexes_list)
print("データ型:", type(row_indexes_list))
2. DataFrameの列名(カラム名)を取得する
DataFrameの各列には、それぞれユニークな「列名」(カラム名)が付けられています。
df.columnsで列名(カラム名)を取得
DataFrameのcolumns属性にアクセスすることで、全ての列名のリストのようなオブジェクト(Indexオブジェクト)を取得できます。
# DataFrameの列名を取得
column_names = df.columns
print("\n列名:\n", column_names)
print("データ型:", type(column_names))
# 列名をPythonリストに変換
column_names_list = df.columns.to_list()
print("\n列名 (リスト形式):\n", column_names_list)
解説:
df.columnsもpd.Indexオブジェクトを返します。これにはDataFrameの全ての列名が含まれており、to_list()で通常のリストに変換できます。
3. 列の位置番号(位置インデックス)を取得する
列名だけでなく、0から始まる数値の「位置」で列を扱いたい場合があります(例: ilocでのアクセス)。
get_loc()で列名から位置番号を取得
特定の列名に対応する位置番号を知りたい場合は、df.columns.get_loc()メソッドが便利です。
# '売上'列の位置番号を取得
sales_col_loc = df.columns.get_loc('売上')
print("\n'売上'列の位置番号:", sales_col_loc)
解説:
df.columns.get_loc(‘売上’)は、’売上’という列名がDataFrameの何番目の列に位置するか(0から始まるインデックス)を返します。
4. 行・列の数を取得する
DataFrameの行数や列数(次元)を取得する方法です。
df.shapeで行数と列数を取得
shape属性は、DataFrameの次元(行数、列数)をタプルで返します。
# DataFrameの行数と列数を取得
rows, cols = df.shape
print("\n行数:", rows)
print("列数:", cols)
解説:
df.shapeは(行数, 列数)のタプルを返します。アンパックしてそれぞれの変数に代入できます。
len(df)で行数を取得
Pythonの組み込み関数len()をDataFrameに適用すると、行数を取得できます。
# DataFrameの行数を取得 (len()を使用)
num_rows_len = len(df)
print("\n行数 (len()を使用):", num_rows_len)
解説:
len(df)はdf.shape[0]と同じ結果を返します。
5. 特定の行・列番号でアクセスする
取得した行番号や列番号を使って、実際にデータにアクセスする例です。
ilocで行の位置番号、列の位置番号でアクセス
ilocは、整数ベースの位置インデックス(0から始まる行番号と列番号)でDataFrameの要素にアクセスします。
# 最初の行(インデックス0)を抽出
first_row = df.iloc[0]
print("\n最初の行:\n", first_row)
# 2番目の列(位置インデックス1)を抽出
second_col = df.iloc[:, 1]
print("\n2番目の列:\n", second_col)
# 2行目2列目の値(位置インデックス1, 1)を取得
value_at_pos_1_1 = df.iloc[1, 1]
print("\n2行目2列目の値:", value_at_pos_1_1)
locでインデックスラベル、列名でアクセス
locは、ラベルベースのインデックス(行ラベルと列名)でDataFrameの要素にアクセスします。
# 'Q2_2023'の行を抽出
row_q2 = df.loc['Q2_2023']
print("\n'Q2_2023'の行:\n", row_q2)
# '売上'列を抽出
sales_col_loc_by_name = df.loc[:, '売上']
print("\n'売上'列 (locを使用):\n", sales_col_loc_by_name)
# 'Q3_2023'行の'商品'列の値を取得
value_q3_product = df.loc['Q3_2023', '商品']
print("\n'Q3_2023'行の'商品'列の値:", value_q3_product)
まとめ
Pandas DataFrameの行番号や列番号(列名)を正確に取得し、活用することは、データ分析の基本でありながら非常に強力なスキルです。
-
行インデックス:
df.indexで取得。 -
列名:
df.columnsで取得。 -
特定の列の位置番号:
df.columns.get_loc('列名')で取得。 -
行数・列数:
df.shapeやlen(df)で取得。 -
取得した情報を使って**
iloc(位置ベース)やloc**(ラベルベース)でデータにアクセス。
これらのテクニックを使いこなすことで、DataFrame内の特定のデータへのアクセス、繰り返し処理、条件による選択、そして効率的なデータ操作が可能になります。あなたのPandasスキルを次のレベルに引き上げるために、ぜひこれらの知識を活用してください。

