Pythonでインデックス列として読み込む入門 — index_col=0
行番号(インデックス)に意味がある表では、読み込み時に「この列をインデックスにする」と決めておくと後の操作がすっきりします。初心者向けに、確実な設定方法と実用コードをまとめます。
基本の使い方
import pandas as pd
# 先頭列(0番目)をインデックスとして読み込む
df = pd.read_excel("table.xlsx", index_col=0)
print(df.head())
print(df.index) # インデックスの中身を確認
Python- 狙い: データの主キー(例: 顧客ID、商品コード、日付)を行インデックスに設定し、行選択や結合を簡単にします。
- 指定方法:
index_colには列番号(0始まり)または列名を渡します。例:index_col="顧客ID"。
よく使うパターンとテンプレート
import pandas as pd
Python特定のキー列をインデックスにする(列名で指定)
df = pd.read_excel("orders.xlsx", index_col="OrderID")
Python- ポイント: 列順の変動に強く、安全です。
列名がない場合(header=None)に先頭列をインデックス化
df = pd.read_excel("no_header.xlsx", header=None, index_col=0, names=["id", "date", "item", "amount"])
Python- ポイント:
namesと併用して、読み込み直後から扱いやすい列名に。
説明行を飛ばしてからインデックスを設定
df = pd.read_excel("report.xlsx", skiprows=5, header=0, index_col=0)
Python- ポイント: 「データ開始行」を正しく指すことが最優先。インデックスは見出し行に同期します。
インデックスを時系列(日付)にして時系列処理へ
df = pd.read_excel("sales.xlsx", parse_dates=["Date"], index_col="Date", usecols=["Date", "Revenue"])
Python- ポイント:
parse_datesと組み合わせると.loc["2025-07"]のような期間抽出が直感的になります。
読み込み後に使える便利ワザ
- 行選択が直感的になる:
# 主キーで行を取得
row = df.loc["CUST_000123"]
Python- 重複インデックスの検出・対処:
# 重複チェック
dup = df.index.duplicated(keep=False)
print("重複件数:", dup.sum())
# 重複があるならユニーク化(例: インデックスを列へ戻す → 連番で再設定)
if dup.any():
df = df.reset_index().drop_duplicates(subset=df.index.name).set_index(df.index.name)
Python- インデックスを列へ戻す(再設定も可):
df = df.reset_index() # インデックスを通常の列に
df = df.set_index("OrderID") # 別の列をインデックスに再設定
Pythonつまずきやすいポイントと回避策
- インデックス列に欠損がある:
回避: 欠損は不可。読み込み前にskiprowsで説明行を飛ばし、読み込み後にdropna(subset=[インデックス列名])をしてからset_index。 - 数値に解釈されて先頭ゼロが消える(コード列):
回避:dtype={"Code":"string"}を併用して文字列固定してからindex_col="Code"を指定。 - インデックスがユニークでない:
影響:.locが曖昧になる。
回避: 読み込み後にdf.index.is_uniqueを確認。ユニーク化が必要なら重複行の解決ルール(最新優先、合計など)を決める。 - 列名で指定したのに見つからない:
回避: 列名の空白や全角半角を正規化。
df = pd.read_excel("file.xlsx")
df = df.rename(columns=lambda c: str(c).strip())
Pythonミニ例題(練習用)
例題1:顧客IDをインデックスにして行取得
import pandas as pd
df = pd.read_excel("customers.xlsx", index_col="CustomerID", usecols=["CustomerID", "Name", "Prefecture"])
print(df.loc["CUST_00123"])
Python例題2:説明行スキップ+先頭列インデックス
import pandas as pd
df = pd.read_excel("report.xlsx", skiprows=4, header=0, index_col=0)
print(df.head())
print("インデックス名:", df.index.name)
Python例題3:日付をインデックスにして月次合計
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["Date"], index_col="Date", usecols=["Date", "Revenue"])
monthly = df["Revenue"].resample("M").sum()
print(monthly)
Python