Pandasで自由自在!インデックス指定で行・列を抽出する方法 🎯


 

PandasのDataFrameを使いこなす上で、特定のを効率的に選択・抽出するスキルは非常に重要です。データ分析の多くの場面で、必要なデータだけを切り出して作業を進めることになります。Pandasでは、この抽出操作を柔軟に行うために、強力なインデックス指定機能を提供しています。

この記事では、インデックスを使ってDataFrameから行や列を抽出する様々な方法を、具体的なコード例を交えながら詳しく解説します。


 

インデックスで列を抽出する 📊

 

まず、DataFrameから特定の列を抽出する方法から見ていきましょう。

 

1. 単一の列を抽出する(Seriesとして)

 

最も一般的な方法で、抽出結果はSeriesオブジェクトになります。

Python
 
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になります。

Python
 
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の行インデックス名を使って行を選択します。

Python
 
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のリストのスライスと同じ感覚で使えます。

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) 📍

 

locilocは、行と列を同時に指定して、特定の範囲のデータを抽出することもできます。

 

locで行と列をラベルで指定 🏷️

 

df.loc[行のラベル指定, 列のラベル指定] の形式で使います。

Python
 
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[行の位置指定, 列の位置指定] の形式で使います。

Python
 
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}")

 

条件式で行を抽出する (ブールインデックス) 🔍

 

特定の条件を満たす行だけを抽出したい場合は、ブールインデックスを使います。これは非常に強力で、データ分析で頻繁に利用されます。

Python
 
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でのデータ操作が格段にスムーズになり、より高度なデータ分析への道が開かれるでしょう。ぜひ様々なデータを試して、これらの抽出テクニックをマスターしてください!