概要(dtypeは「列の型」。正しく揃えると計算・集計・可視化が安定する)
pandasのdtype(データ型)は、各列が「数値・文字列・日時・真偽値・カテゴリなどのどれか」を表すラベルです。型がズレていると、数値計算ができなかったり、並び替えや結合が意図通りに動かないことがあります。初心者は「型の確認」「型の正規化(変換)」「欠損の扱い」の3点を押さえるだけで、ほとんどのトラブルを避けられます。
基本の確認(dtypes・info・個別列のdtype)
列の型を一覧で確認する
import pandas as pd
df = pd.DataFrame({
"id": [1, 2, 3],
"price": [100.5, 200.0, 150.25],
"name": ["apple", "banana", "cherry"],
"passed": [True, False, True]
})
print(df.dtypes)
# id int64
# price float64
# name object
# passed bool
# dtype: object
Pythonobjectは「文字列や混在型」を意味します。数値や日時として扱いたい列がobjectなら、後で変換が必要です。
欠損・型・行数までまとめて確認する
df.info()
Python行数、欠損の有無、各列のdtypeが一目で分かります。前処理の出発点に最適です。
個別列・要素の型を見る
print(df["price"].dtype) # float64
print(type(df["price"][0])) # <class 'numpy.float64'>
Python「列のdtype」と「要素のPython/NumPy型」の両方を把握すると、細かな型ズレに気づけます。
よく使う型変換(astype・to_numeric・to_datetime・カテゴリ)
数値へ変換(文字列数値を正しく数値へ)
s = pd.Series(["10", "20", "x"])
num = pd.to_numeric(s, errors="coerce") # "x"はNaNになる
print(num)
# 0 10.0
# 1 20.0
# 2 NaN
# dtype: float64
Pythonerrors=”coerce”は、変換できない値をNaNへ。安全に数値化して後工程へ進めます。
日時へ変換(文字列日付を時系列に)
dates = pd.Series(["2025-01-01", "2024/12/31", "bad"])
dt = pd.to_datetime(dates, errors="coerce")
print(dt)
# 文字列のままだと辞書順。日時型へ変換してからソート・集計します。
Pythonカテゴリ型でメモリ効率・順序固定
import pandas as pd
order = pd.CategoricalDtype(categories=["Low", "Medium", "High"], ordered=True)
df = pd.DataFrame({"level": ["High", "Low", "Medium", "Low"]})
df["level"] = df["level"].astype(order)
Pythonカテゴリ型はユニーク値が少ないラベルに強く、並び順の固定にも便利です。
astypeで明示的に型を揃える
df["id"] = df["id"].astype("int64")
df["price"] = df["price"].astype("float64")
df["passed"] = df["passed"].astype("bool")
Python列の目的に合わせて、はっきり型を確定させます。
欠損とdtype(NaN/None/pd.NA、nullable整数Int64)
欠損がある数値列は“浮動小数”に落ちやすい
s = pd.Series([1, None, 3]) # → float64(NaNを表現するため)
PythonintはNaNを持てないため、欠損が混じるとfloat64になります。整数列を保ちたいなら“nullable整数”を使います。
nullable整数・文字列(拡張型)で欠損に強く
s = pd.Series([1, None, 3], dtype="Int64") # 大文字I:欠損可の整数
t = pd.Series(["a", None, "b"], dtype="string")
Python“Int64(拡張)”や“string”はpd.NAで欠損を表現できます。数値のまま欠損を持ちたいときに有効です。
欠損の正規化を先に
df["name"] = df["name"].fillna("").str.strip().str.lower()
df["age"] = pd.to_numeric(df["age"], errors="coerce") # 変換不可はNaN
Python欠損と型の整理を“最初に”やるだけで、その後の計算が安定します。
実践例(型ズレの解消・時系列分析・カテゴリ分析)
数値っぽい文字列を安全に数値化して集計
df = pd.DataFrame({"qty": ["10", "20", "x", None]})
df["qty"] = pd.to_numeric(df["qty"], errors="coerce").fillna(0).astype("int64")
print(df["qty"].sum()) # 30
Python変換→欠損穴埋め→型確定の順で、エラーなく集計できます。
日付列の正規化→並べ替え→月別集計
df = pd.DataFrame({"date": ["2025-01-02", "2024-12-31", "bad"], "sales": [100, 120, 200]})
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df = df.dropna(subset=["date"]).sort_values("date")
monthly = df.set_index("date").resample("M")["sales"].sum()
Python日時型にしてから時系列の機能(resample等)が使えます。
ラベル列をカテゴリ型へ→順序固定でレポート
df = pd.DataFrame({"level": ["High","Low","Medium","Low"], "score": [90, 50, 70, 60]})
order = pd.CategoricalDtype(categories=["Low","Medium","High"], ordered=True)
df["level"] = df["level"].astype(order)
report = df.sort_values("level").groupby("level", as_index=False)["score"].mean()
print(report)
Python期待する順序で並び、集計結果の見通しが良くなります。
重要ポイントの深掘り(型の一貫性・前処理順・エラー対策・メモリ)
型は“目的に合わせて一貫”させる
- 数値計算したい列: float64/Int64へ正規化し、文字列混入を排除。
- 文字列処理する列: string/objectへ寄せ、strip/lowerで整形。
- 時系列: datetime64[ns]へ。文字列のままにしない。
前処理の順番を固定する
- 欠損の正規化 → 型変換 → 整形(大小・空白) → 集計・可視化 この順序なら「型エラー」「辞書順ソート」「誤結合」を避けられます。
変換エラーはcoerceで潰してから扱う
- to_numeric/to_datetime(errors=”coerce”) で“変換不可=NaN/pd.NA”に落とす。
- その後、fillnaやdropnaでポリシーに従って整える。
メモリ効率を意識する
- カテゴリ型でユニーク少ない文字列を圧縮。
- downcastで小さめの数値型へ。
import pandas as pd
num = pd.to_numeric(pd.Series([1,2,3]), downcast="integer") # int8/16/32へ落とす可能性
Pythonまとめ(「型を確認→正規化→確定」。dtypeを制する者がデータ処理を制す)
dtypeは列が“どう扱われるべきか”を決める根幹です。まずdtypes/infoで現状を掴み、欠損を正規化してから、to_numeric/to_datetime/astypeで目的の型へ確定。必要ならInt64・string・categoryの拡張型を使い、メモリ効率や順序も整える。この型の流れを身体に入れれば、初心者でも“計算は正しく、並びは意図通り、結合は安全”な前処理を再現性高く進められます。
