PythonでExcelのデータ型を指定する入門 — dtype={‘col’: str}
「郵便番号の先頭ゼロが消えた」「商品コードが数値になってしまう」— こうした型ぶれは読み込み時に直すのが最短です。pandas.read_excel の dtype 引数を使って、列の型を確実に固定する方法を初心者向けにまとめます。
基本の使い方と考え方
import pandas as pd
# 列の型を固定して読み込む
df = pd.read_excel(
"orders.xlsx",
dtype={"OrderID": "string", "CustomerID": "string"}
)
print(df.dtypes)
Python- 狙い: 読み込み時点で「文字列・整数・浮動小数」を決めておくと、その後の集計や結合が安定します。
- ポイント:
dtypeは「列名→型」の辞書を渡します。型は"string"、"Int64"、float、objectなどを使います。
代表的な型指定(よくある帳票向け)
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。 クリーニングを入れてから型固定すると失敗しにくいです.
