Python | データ処理:dtype

Python
スポンサーリンク

概要(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
Python

objectは「文字列や混在型」を意味します。数値や日時として扱いたい列が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
Python

errors=”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を表現するため)
Python

intは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の拡張型を使い、メモリ効率や順序も整える。この型の流れを身体に入れれば、初心者でも“計算は正しく、並びは意図通り、結合は安全”な前処理を再現性高く進められます。

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