Python Excel操作 逆引き集 | Excelファイルを読み込む

Python
スポンサーリンク

PythonでExcelを読み込む入門 — pandas.read_excel

はじめてでも迷わないように、基本の使い方から「つまずきポイント」まで、やさしく丁寧に整理します。実行できるコード例、よくあるシート構成のテンプレート、練習問題も用意しました。


事前準備と基本の流れ

必要なライブラリのインストール

  • pandas: データ分析の定番ライブラリ pip install pandas
  • Excelエンジン: .xlsx は openpyxl、.xls は xlrd が必要 pip install openpyxl pip install xlrd

最小コード(まずは1枚のシートを読む)

import pandas as pd

# 同じフォルダにある "sample.xlsx" の先頭シートを読み込む
df = pd.read_excel("sample.xlsx")

# 中身を確認
print(df.head())      # 先頭5行
print(df.info())      # 列名・型・欠損の有無
Python
  • ポイント: まずは head()info() を見て「列名」「データ型」「欠損(NaN)」を把握します。

よく使う引数と実例テンプレート

シートを指定する(sheet_name)

# シート名で指定
df = pd.read_excel("sales.xlsx", sheet_name="2024_Q4")

# 複数シートを一度に読み込み(辞書で返る)
dfs = pd.read_excel("sales.xlsx", sheet_name=["2024_Q3", "2024_Q4"])
print(dfs["2024_Q4"].head())
Python
  • ポイント: 複数読み込み時は「シート名→DataFrame」の辞書になります。

列や範囲を絞る(usecols)

# 列名で列を選択
df = pd.read_excel("sales.xlsx", usecols=["Date", "Product", "Revenue"])

# Excelの列記法で指定(A〜D列)
df = pd.read_excel("sales.xlsx", usecols="A:D")
Python
  • ポイント: 読み込み段階で不要列を避けると速く、メモリも節約できます。

ヘッダー行の指定(header)

# 2行目が列名の場合(0始まりなので1)
df = pd.read_excel("report.xlsx", header=1)
Python
  • ポイント: タイトル行や説明行が先頭にある帳票でよく使います。

先頭の余分な行を飛ばす(skiprows)

# 先頭3行をスキップ(0,1,2行目を飛ばす)
df = pd.read_excel("report.xlsx", skiprows=3)
Python
  • ポイント: 会社ロゴや注記を含む帳票で「本データ開始行」まで飛ばすのが定石。

行番号・列名の扱い(index_col、names)

# 1列目を行番号として使う
df = pd.read_excel("table.xlsx", index_col=0)

# ヘッダーがない(列名を自分で付ける)
df = pd.read_excel("no_header.xlsx", header=None, names=["Date", "Item", "Qty", "Price"])
Python
  • ポイント: 入力データが「見出しなし」のときは header=Nonenames をセットで。

型の指定(dtype)と特殊変換(converters)

# 誤って数値扱いされた商品コードを文字列に固定
df = pd.read_excel("items.xlsx", dtype={"ItemCode": "string"})

# 文字列をクリーニングして数値化する例
def clean_int(s):
    if pd.isna(s):
        return None
    return int(str(s).replace(",", "").strip())

df = pd.read_excel("items.xlsx", converters={"Qty": clean_int})
Python
  • ポイント: 「郵便番号」「先頭ゼロつきコード」は文字列型に固定が安全。

日付の扱い(parse_dates、dayfirst)

# 日付列を自動で日付型へ
df = pd.read_excel("log.xlsx", parse_dates=["Date"])

# 日付が DD/MM/YYYY 形式なら
df = pd.read_excel("log.xlsx", parse_dates=["Date"], dayfirst=True)
Python
  • ポイント: 日付は文字列のままだと計算・比較が面倒。読み込みで型変換を済ませると楽です。

欠損値の指定(na_values、keep_default_na)

# 特定の文字を欠損扱いにする
df = pd.read_excel("survey.xlsx", na_values=["N/A", "-", "不明"])

# 既定の欠損(空白や 'NA' など)を無効にしたい場合
df = pd.read_excel("survey.xlsx", keep_default_na=False)
Python
  • ポイント: 帳票独特の「不明」「—」などをNaNに揃えると解析がしやすくなります。

実践シナリオ別テンプレート

帳票の先頭にタイトルや注記がある

import pandas as pd

df = pd.read_excel(
    "monthly_report.xlsx",
    skiprows=5,   # 6行目からが表
    header=0,     # その行が列名
    usecols="A:F" # 欲しい列だけ
)
print(df.head())
Python
  • 狙い: 読み込み段階で「余分」を削り、列名も整える。

複数シートを縦に結合して1つの表へ

import pandas as pd

sheets = ["2024_Q1", "2024_Q2", "2024_Q3", "2024_Q4"]
dfs = [pd.read_excel("sales.xlsx", sheet_name=s, usecols=["Date", "Product", "Revenue"]) for s in sheets]
all_sales = pd.concat(dfs, ignore_index=True)

print(all_sales.shape)
Python
  • 狙い: 四半期別シートを「縦方向に」連結して通期データ1本に。

列型を強制して分析前に整える

import pandas as pd

df = pd.read_excel(
    "orders.xlsx",
    dtype={"OrderID": "string", "CustomerID": "string"},
    parse_dates=["OrderDate"],
    na_values=["-", "N/A"]
)

# 洗浄の一例
df["Qty"] = df["Qty"].astype("Int64")   # 欠損に対応する整数型
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
Python
  • 狙い: 文字列・整数・日付を先に固めると、この後の集計が安定します。

Excelの列記法で範囲を読む(表が途中から始まる)

import pandas as pd

# 例: 実データは B4 から G100 まで(列はB〜G、行は3行スキップ)
df = pd.read_excel("layout.xlsx", usecols="B:G", skiprows=3, nrows=97)
print(df.head())
Python
  • 狙い: レイアウトの都合で表が途中から始まる帳票に対応。

読み込み後のよくある整形ワザ

  • 空白の除去:
df = df.rename(columns=lambda c: c.strip())
for col in df.select_dtypes(include="object"):
    df[col] = df[col].str.strip()
Python
  • 重複行の除去:
df = df.drop_duplicates()
Python
  • 列名の一括リネーム(日本語→英語やスネークケース):
df = df.rename(columns={
    "日付": "date",
    "商品名": "product",
    "金額(円)": "amount_jpy"
})
Python
  • 欠損の補完:
df["amount_jpy"] = df["amount_jpy"].fillna(0)
Python

つまずきやすいポイントと回避策

  • .xlsx が読めない:
    原因: openpyxl が未インストール。
    対策: pip install openpyxl
  • .xls が読めない:
    原因: xlrd のサポート。
    対策: pip install xlrd
  • 先頭ゼロが消える(郵便番号・商品コード):
    原因: 数値として解釈。
    対策: dtype={"PostalCode": "string"} で文字列固定。
  • 日付が文字列のまま:
    原因: フォーマット混在。
    対策: parse_dates=["Date"]、または後処理で pd.to_datetime(df["Date"], errors="coerce")
  • 変な記号や「—」が混じる:
    対策: na_values=["—", "-"] で欠損化、または str.replace でクリーニング。

ミニ例題(手を動かして慣れる)

例題1:売上シートの基本読み込み

  • 課題: sales.xlsx の「2025_Q3」シートから「Date, Product, Revenue」だけ読み込み、先頭10行を表示。
  • ヒント: sheet_nameusecols を使う。
import pandas as pd
df = pd.read_excel("sales.xlsx", sheet_name="2025_Q3", usecols=["Date", "Product", "Revenue"])
print(df.head(10))
Python

例題2:タイトル行スキップ+列名付け

  • 課題: 先頭5行が説明の report.xlsx を6行目から読んで、列名を ["date","item","qty","price"] にする。
  • ヒント: skiprowsheader=Nonenames
import pandas as pd
df = pd.read_excel("report.xlsx", skiprows=5, header=None, names=["date","item","qty","price"])
print(df.info())
Python

例題3:型の固定と集計

  • 課題: orders.xlsxOrderID を文字列、OrderDate を日付、Amount を数値にして、月別合計金額を出す。
import pandas as pd

df = pd.read_excel(
    "orders.xlsx",
    dtype={"OrderID": "string"},
    parse_dates=["OrderDate"]
)
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")

monthly = (
    df.assign(month=df["OrderDate"].dt.to_period("M"))
      .groupby("month", as_index=False)["Amount"].sum()
)
print(monthly)
Python

逆引き早見リスト(覚えておくと便利)

  • シート指定: sheet_name="Sheet1" または ["S1","S2"]
  • 列選択: usecols=["A","B"]usecols="A:D"
  • ヘッダー行: header=0(既定)/header=None(列名なし)
  • 先頭行スキップ: skiprows=3
  • 行数制限: nrows=100
  • 行番号列: index_col=0
  • 型指定: dtype={"Code":"string"}
  • 日付変換: parse_dates=["Date"]
  • 欠損指定: na_values=["-", "N/A"]
  • カスタム変換: converters={"Qty": func}
タイトルとURLをコピーしました