Python Excel操作 逆引き集 | 読み込み時にデータ型を指定する

Python
スポンサーリンク

PythonでExcelのデータ型を指定する入門 — dtype={‘col’: str}

「郵便番号の先頭ゼロが消えた」「商品コードが数値になってしまう」— こうした型ぶれは読み込み時に直すのが最短です。pandas.read_exceldtype 引数を使って、列の型を確実に固定する方法を初心者向けにまとめます。


基本の使い方と考え方

import pandas as pd

# 列の型を固定して読み込む
df = pd.read_excel(
    "orders.xlsx",
    dtype={"OrderID": "string", "CustomerID": "string"}
)

print(df.dtypes)
Python
  • 狙い: 読み込み時点で「文字列・整数・浮動小数」を決めておくと、その後の集計や結合が安定します。
  • ポイント: dtype は「列名→型」の辞書を渡します。型は "string""Int64"floatobject などを使います。

代表的な型指定(よくある帳票向け)

import pandas as pd

df = pd.read_excel(
    "report.xlsx",
    dtype={
        "郵便番号": "string",  # 先頭ゼロ保持
        "商品コード": "string",
        "数量": "Int64",       # 欠損に対応する整数型(nullable整数)
        "単価": float,         # 小数あり
    },
    parse_dates=["注文日"]      # 日付は dtype ではなく parse_dates
)
Python
  • 文字列固定: 「コード」「ID」「郵便番号」"string" にすると安全です。
  • 整数で欠損あり: "Int64"(nullable整数) を使うと NaN と両立します。通常の int は NaN を扱えません。
  • 日付: dtype ではなく parse_dates を使います。混在時は後処理で pd.to_datetime(..., errors="coerce")

dtype と converters の違い(使い分けのコツ)

  • 基本は dtype: 「型を固定するだけ」 なら最速・簡単です。
  • クリーニングが必要なら converters: 「カンマ除去」「単位文字を外す」「異常値を補正」 のような前処理が要る場合は関数で変換します。
import pandas as pd

def to_int_clean(x):
    if pd.isna(x): return None
    return int(str(x).replace(",", "").replace("個", "").strip())

df = pd.read_excel(
    "items.xlsx",
    converters={"数量": to_int_clean},
    dtype={"商品コード": "string"}
)
Python
  • 使い分け: 単純固定→dtype、加工→converters。併用もできます。

よくある落とし穴と回避策

  • 日付を dtype=str にすると面倒になる
    • 回避: parse_dates=["日付"] を使う。後処理なら pd.to_datetime(..., errors="coerce")
  • 先頭ゼロが消える
    • 原因: 数値として解釈される。
    • 回避: "string" で読み、必要なら str.zfill(7) で桁揃え。
  • 整数列に欠損があるのに int 指定でエラー
    • 回避: "Int64" を使う(pandasのnullable整数)。
  • シートごとに列型がバラつく
    • 回避: 読み込み後に一括で astype。または全シートに同じ dtype を指定してから足りない列を追加。
# 読み込み後に一括で揃える例
for col in ["OrderID", "CustomerID"]:
    df[col] = df[col].astype("string")
Python

実践テンプレート

コード列を文字列、数量をnullable整数、金額を数値にする

import pandas as pd

df = pd.read_excel(
    "orders.xlsx",
    dtype={"OrderID": "string", "CustomerID": "string", "Qty": "Int64"},
    usecols=["OrderID", "CustomerID", "Qty", "Amount"]
)
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
print(df.dtypes)
Python

文字列で読みつつ、読み込み後に一括数値化

import pandas as pd

df = pd.read_excel("report.xlsx", dtype={"数量": "string", "金額(円)": "string"})
df["数量"] = pd.to_numeric(df["数量"].str.replace(",", ""), errors="coerce")
df["金額(円)"] = pd.to_numeric(df["金額(円)"].str.replace(",", ""), errors="coerce")
Python

複数シートでも同じ dtype を適用

import pandas as pd

dfs = pd.read_excel(
    "sales.xlsx",
    sheet_name=None,
    dtype={"ProductCode": "string", "Qty": "Int64"},
    parse_dates=["Date"]
)

# 後処理の統一
for name, d in dfs.items():
    d["Revenue"] = pd.to_numeric(d.get("Revenue"), errors="coerce")
Python

ミニ例題(練習用)

  • 例題1: コード列の先頭ゼロを守る
import pandas as pd
df = pd.read_excel("codes.xlsx", dtype={"郵便番号": "string", "商品コード": "string"})
print(df["郵便番号"].head())
Python
  • 例題2: 欠損を含む数量を整数で扱う
import pandas as pd
df = pd.read_excel("inventory.xlsx", dtype={"数量": "Int64"})
print(df["数量"].isna().sum())  # 欠損ありでも整数として扱える
Python
  • 例題3: 日付は parse_dates、金額は数値化
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["Date"], dtype={"OrderID": "string"})
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
print(df.info())
Python

まとめと次の一歩

  • 型ぶれ防止の基本は dtype。 コードやIDは "string"、欠損あり整数は "Int64" が定番です。
  • 日付は parse_dates。 dtype ではなく専用引数を使うと安全です。
  • 加工が必要なら converters。 クリーニングを入れてから型固定すると失敗しにくいです.

タイトルとURLをコピーしました