Pandasで自由自在!インデックス指定で行・列を抽出する方法 🎯
PandasのDataFrame
を使いこなす上で、特定の行や列を効率的に選択・抽出するスキルは非常に重要です。データ分析の多くの場面で、必要なデータだけを切り出して作業を進めることになります。Pandasでは、この抽出操作を柔軟に行うために、強力なインデックス指定機能を提供しています。
この記事では、インデックスを使ってDataFrame
から行や列を抽出する様々な方法を、具体的なコード例を交えながら詳しく解説します。
インデックスで列を抽出する 📊
まず、DataFrame
から特定の列を抽出する方法から見ていきましょう。
1. 単一の列を抽出する(Seriesとして)
最も一般的な方法で、抽出結果はSeries
オブジェクトになります。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
})
# '商品名'列を抽出
product_names = df['商品名']
print("--- '商品名'列をSeriesとして抽出 ---")
print(product_names)
print(f"型: {type(product_names)}")
2. 複数の列を抽出する(DataFrameとして)
複数の列を抽出したい場合は、列名のリストを使います。抽出結果はDataFrame
になります。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
})
# '商品名'と'価格'列を抽出
selected_cols = df[['商品名', '価格']]
print("\n--- 複数の列をDataFrameとして抽出 ---")
print(selected_cols)
print(f"型: {type(selected_cols)}")
インデックスで「行」を抽出する (loc
, iloc
) 🎯
行の抽出には、**ラベル(インデックス名)**を使うloc
と、**位置(整数インデックス)**を使うiloc
が主に使われます。
1. loc
:ラベル(インデックス名)で行を抽出 🏷️
loc
は、DataFrame
の行インデックス名を使って行を選択します。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120]
}, index=['A', 'B', 'C']) # カスタムインデックス
print("--- カスタムインデックスのDataFrame ---")
print(df)
# 単一の行を抽出
row_A = df.loc['A']
print(f"\nインデックス'A'の行:\n{row_A}")
# 複数の行をリストで抽出
rows_AC = df.loc[['A', 'C']]
print(f"\nインデックス'A'と'C'の行:\n{rows_AC}")
# 範囲指定で連続する行を抽出 (終了ラベルも含む)
rows_AB = df.loc['A':'B']
print(f"\nインデックス'A'から'B'の行:\n{rows_AB}")
2. iloc
:位置(整数インデックス)で行を抽出 🔢
iloc
は、DataFrame
の行の位置(0から始まる整数)を使って行を選択します。Pythonのリストのスライスと同じ感覚で使えます。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120]
}) # デフォルトの数値インデックス
print("--- デフォルトインデックスのDataFrame ---")
print(df)
# 単一の行を抽出 (0番目の行)
first_row = df.iloc[0]
print(f"\n0番目の行:\n{first_row}")
# 複数の行をリストで抽出 (0番目と2番目の行)
rows_0_2 = df.iloc[[0, 2]]
print(f"\n0番目と2番目の行:\n{rows_0_2}")
# 範囲指定で連続する行を抽出 (終了位置は含まない)
rows_0_to_1 = df.iloc[0:2] # 0番目と1番目の行
print(f"\n0番目から1番目の行:\n{rows_0_to_1}")
行と列を同時に抽出する (loc
, iloc
) 📍
loc
やiloc
は、行と列を同時に指定して、特定の範囲のデータを抽出することもできます。
loc
で行と列をラベルで指定 🏷️
df.loc[行のラベル指定, 列のラベル指定]
の形式で使います。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
}, index=['A', 'B', 'C']) # カスタムインデックス
# インデックス'A'と'C'の'商品名'と'在庫数'列を抽出
subset_loc = df.loc[['A', 'C'], ['商品名', '在庫数']]
print("\n--- locで行と列をラベルで指定 ---")
print(subset_loc)
# インデックス'A'から'B'の範囲、かつ'価格'列のみを抽出
subset_range_loc = df.loc['A':'B', '価格']
print(f"\nlocで範囲と単一列を指定:\n{subset_range_loc}")
iloc
で行と列を位置で指定 🔢
df.iloc[行の位置指定, 列の位置指定]
の形式で使います。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 80, 120],
'在庫数': [50, 120, 30]
}) # デフォルトの数値インデックス
# 0番目と2番目の行、かつ0番目と2番目の列を抽出
subset_iloc = df.iloc[[0, 2], [0, 2]]
print("\n--- ilocで行と列を位置で指定 ---")
print(subset_iloc)
# 0番目から1番目の行の範囲、かつ1番目の列のみを抽出
subset_range_iloc = df.iloc[0:2, 1]
print(f"\nilocで範囲と単一列を指定:\n{subset_range_iloc}")
条件式で行を抽出する (ブールインデックス) 🔍
特定の条件を満たす行だけを抽出したい場合は、ブールインデックスを使います。これは非常に強力で、データ分析で頻繁に利用されます。
import pandas as pd
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ', 'ぶどう'],
'価格': [100, 80, 120, 250],
'在庫数': [50, 120, 30, 10]
})
# 価格が100円以上の商品を抽出
expensive_items = df[df['価格'] >= 100]
print("\n--- 価格が100円以上の商品を抽出 ---")
print(expensive_items)
# 在庫数が50個未満、かつ商品名が「バナナ」ではない商品を抽出
complex_filter = df[(df['在庫数'] < 50) & (df['商品名'] != 'バナナ')]
print("\n--- 複合条件で抽出 ---")
print(complex_filter)
# `loc`と組み合わせて特定の列だけ抽出
expensive_item_names = df.loc[df['価格'] >= 100, '商品名']
print(f"\n価格が100円以上の商品名:\n{expensive_item_names}")
まとめ:使い分けのポイント 💡
列の抽出:
単一列を
Series
で:df['列名']
複数列を
DataFrame
で:df[['列名1', '列名2']]
行の抽出:
ラベル名で指定したい場合:
df.loc[...]
**位置(整数)**で指定したい場合:
df.iloc[...]
行と列を同時に指定:
ラベル名で:
df.loc[行ラベル, 列ラベル]
位置で:
df.iloc[行位置, 列位置]
条件で抽出:
df[条件式]
またはdf.loc[条件式, ...]
これらのインデックス指定方法を習得することで、Pandasでのデータ操作が格段にスムーズになり、より高度なデータ分析への道が開かれるでしょう。ぜひ様々なデータを試して、これらの抽出テクニックをマスターしてください!