Python Excel操作 逆引き集 | インデックス列として読み込む

Python
スポンサーリンク

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
タイトルとURLをコピーしました