Pandas Index(インデックス)

Index(インデックス)は Pandas データ構造の中心的な構成要素であり、データの編成とアクセス方法を決定します。Pandas は単純な RangeIndex から複雑な多層インデックス(MultiIndex)まで、さまざまな種類のインデックスをサポートしています。このセクションでは、各種インデックスの使用方法を詳しく説明します。


Index の基本概念

Index はデータベースの主キーや Excel の行番号に似ており、各行のデータを一意に識別するために使用されます。DataFrame には行インデックス(index)と列インデックス(columns)の2つの部分があります。

例

import pandas as pd

# 単純な DataFrame を作成(デフォルトで RangeIndex を使用)
df = pd.DataFrame({
    "名前": ["张三", "李四", "王五"],
    "年齢": [25, 30, 28],
    "都市": ["北京", "上海", "広州"]
})

print("DataFrame の情報:")
print(f"行インデックス: {df.index.tolist()}")
print(f"列インデックス: {df.columns.tolist()}")
print("\nデータ:")
print(df)

RangeIndex

RangeIndex はデフォルトの整数インデックスであり、Python のrange(n)、0 から始まって増加します。

作成と使用

例

import pandas as pd

# RangeIndex を作成
idx = pd.RangeIndex(start=0, stop=10, step=1)
print(f"RangeIndex: {idx}")
print(f"型: {type(idx)}")

# DataFrame はデフォルトで RangeIndex を使用
df = pd.DataFrame({"A": [1, 2, 3]}, index=range(3))
print(f"\nデフォルトのインデックス型: {type(df.index)}")

# インデックスをリセットしても RangeIndex が返される
df_reset = df.reset_index()
print(f"リセット後のインデックス型: {type(df_reset.index)}")

RangeIndex の特徴

  • メモリ使用量が最小
  • デフォルトの整数位置でのアクセスをサポート
  • 他のインデックス型への変換が簡単

Index の型変換

Index は複数の型の間で変換できます。

他のインデックス型への変換

例

import pandas as pd

# サンプル DataFrame を作成
df = pd.DataFrame({"値": [1, 2, 3, 4]}, index=[10, 20, 30, 40])

# Index 型に変換
print("元のインデックス:", df.index)
print("インデックスの型:", type(df.index))

"リストに変換: {idx_list}"
idx_list = df.index.tolist()
print(f# NumPy 配列に変換)

"配列に変換: {idx_array}"
idx_array = df.index.values
print(f# インデックスを RangeIndex に再設定)

"RangeIndex にリセット: {df.index}"
df = df.reset_index(drop=True)
print(fカスタムインデックスの設定)

カスタムインデックスの設定

set_index を使用

set_index を使用

例

import pandas as pd

"学籍番号"
df = pd.DataFrame({
    "名前": ["S001", "S002", "S003", "S004"],
    "张三": ["李四", "王五", "赵六", "点数"],
    "元のデータ:": [85, 92, 78, 90]
})

print(# 「学籍番号」列をインデックスに設定)
print(df)
print()

"学籍番号"
df1 = df.set_index("学籍番号をインデックスに設定:")
print(# 複数のインデックスを設定(MultiIndex が作成されます))
print(df1)
print()

"学籍番号"
df2 = df.set_index(["名前", "複数のインデックスを設定:"])
print(例)
print(df2)

index パラメータを使用して作成

例

import pandas as pd

# DataFrame の作成時にインデックスを直接指定
df = pd.DataFrame(
    {"名前": ["张三", "李四", "王五"], "年齢": [25, 30, 28]},
    index=["A001", "A002", "A003"]
)

print(df)
print(f"\nインデックス: {df.index.tolist()}")

# DatetimeIndex を使用
dates = pd.date_range("2024-01-01", periods=3, freq="D")
df_date = pd.DataFrame({"値": [100, 200, 300]}, index=dates)

print("\n日付インデックスを使用:)
print(df_date)
print(f"インデックスの型: {type(df_date.index)}")

インデックス操作

インデックスのリセット

例

import pandas as pd

# カスタムインデックスを持つ DataFrame を作成
df = pd.DataFrame(
    {"名前": ["张三", "李四"], "点数": [85, 92]},
    index=["A001", "A002"]
)

# インデックスをデフォルトの RangeIndex にリセット
df_reset = df.reset_index()
print("インデックスのリセット:")
print(df_reset)

# drop パラメータ:元のインデックス列を破棄するかどうか
df_reset2 = df.reset_index(drop=True)
print("\nリセットして元のインデックスを破棄:)
print(df_reset2)

再インデックス

例

import pandas as pd

# DataFrame を作成
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[1, 2, 3])

# 再インデックス(インデックスの順序を変更)
df_reindex = df.reindex([1, 2, 3, 4, 5])
print("再インデックス(欠損値は NaN で埋める):")
print(df_reindex)

# fill_value を使用して欠損値を埋める
df_reindex2 = df.reindex([1, 2, 3, 4, 5], fill_value=0)
print("\n再インデックス(0 で埋める):")
print(df_reindex2)

インデックスの階層操作

例

import pandas as pd

# 多層インデックスの DataFrame を作成
df = pd.DataFrame({
    "国語": [85, 92, 78],
    "数学": [90, 88, 95]
}, index=pd.MultiIndex.from_tuples(
    [("高1", "A組"), ("高1", "B組"), ("高2", "A組")],
    names=["学年", "クラス"]
))

print(多層インデックス DataFrame:)
print(df)
print()

# 外側のインデックスを取得
print(f"外側のインデックス(学年): {df.index.get_level_values(0).tolist()}")
print(f"内側のインデックス(クラス): {df.index.get_level_values(1).tolist()}")

インデックスの属性とメソッド

属性/メソッド 説明 例
index.tolist() Python のリストに変換 df.index.tolist()
index.values NumPy 配列に変換 df.index.values
index.unique() 一意の値を取得 df.index.unique()
index.is_unique インデックスが一意かどうかを確認 df.index.is_unique
index.astype() インデックスの型を変換 df.index.astype(str)

インデックス属性の使用例

例

import pandas as pd

# サンプル DataFrame を作成
df = pd.DataFrame(
    {"値": [1, 2, 3, 4]},
    index=["a", "b", "c", "d"]
)

# インデックス属性を確認
print(f"インデックスが一意かどうか: {df.index.is_unique}")
print(f"インデックスの長さ: {len(df.index)}")
print(f"インデックスのデータ型: {df.index.dtype}")

# 文字列型に変換
str_index = df.index.astype(str)
print(f"変換後の型: {str_index.dtype}")

実践:インデックスを使用してクエリ効率を向上させる

実際のデータ分析では、インデックスを適切に設定することでクエリ効率を大幅に向上させることができます。

例

import pandas as pd

# ビジネスデータをシミュレート
df = pd.DataFrame({
    "注文ID": range(1000),
    "顧客ID": [f"C{i%100:03d}" for i in range(1000)],
    "製品": [f"製品{i%20}" for i in range(1000)],
    "金額": [round(i * 1.5, 2) for i in range(1000)]
})

# よく使うクエリ列をインデックスに設定
df_indexed = df.set_index(["顧客ID", "製品"])

# インデックスを使用した高速クエリ(データベースの主キークエリに類似)
result = df_indexed.loc[("C001", "製品1")]
print("インデックスを使用して単一顧客の製品をクエリ:")
print(result)

# 顧客IDでグループ化して集計
print("\n各顧客の消費総額:")
customer_total = df.groupby("顧客ID")["金額"].sum()
print(customer_total.head(10))

注意事項

1、インデックス値は一意である必要があります

インデックス値が一意でない場合、一部の操作(例:loc検索)は複数の一致する行を返します。

2、インデックスには名前を付けられます

インデックスに名前を付けるとコードの可読性が向上します:df.index.name = "学号"

3、インデックスはデータ操作に追従します

スライス、フィルタリングなどの操作はインデックスを保持するため、インデックスとデータの対応関係に注意が必要です。

インデックスはPandasのパフォーマンスの鍵です。頻繁に使用するクエリ列をインデックスに設定すると検索速度が大幅に向上しますが、インデックスが多すぎると書き込みオーバーヘッドが増加するため、バランスを考慮して使用する必要があります。

その他の拡張