PythonのPandasの型変換について

Python,イメージ

AI実装検定のご案内

Pandasでの型変換(データ型の変更)はデータ処理の基礎であり、分析や前処理の際に非常に重要です。

ここでは、基本から応用まで体系的に詳しく解説します。

目次

Pandasにおけるデータ型の基本

Pandasでは、NumPyのdtypeをベースにしています。

代表的な型は以下の通りです。

  • int(整数型): int64, int32など
  • float(浮動小数点型): float64, float32
  • bool(真偽値): True/False
  • object: 文字列や混在データ
  • category: カテゴリ型(省メモリ&高速処理に有効)
  • datetime64: 日付や日時
  • timedelta64: 時間差

型変換の方法

astype()メソッド

もっとも基本的な変換方法です。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "age": ["23", "35", "42"],
    "flag": [1, 0, 1],
    "price": [100.5, 200.7, 150.2]
})

# int, bool, floatへの基本変換
df["age"] = df["age"].astype(int)
df["flag"] = df["flag"].astype(bool)
df["price"] = df["price"].astype("float32")

print(df.dtypes)
print(df)

astype()は明示的に指定するので、確実に変換したいときに便利です。

ただし、変換不可能な値(例: "abc"をintに変換)はValueErrorを出します。

pd.to_numeric()

文字列を数値に変換するときに便利。エラー処理が柔軟です。

import pandas as pd

df = pd.DataFrame({"col": ["1", "2", "three", "4", "--", "5.6"]})

# 変換できないものをNaNにする
df["col_num"] = pd.to_numeric(df["col"], errors="coerce")

print(df)
print(df.dtypes)

errors="coerce"で不正値をNaNに変換できるため、前処理に多用されます。

日付型の変換 pd.to_datetime()

日時データを扱う際には必須です。

import pandas as pd

df = pd.DataFrame({
    "date_raw": ["2024-01-01", "2024/02/15", "March 3, 2024", "2024-04-05 12:30:00", "invalid"]
})

# 自動推定(遅いことがあるが簡単)
df["date_auto"] = pd.to_datetime(df["date_raw"], errors="coerce")

# 形式が一定の場合はformat指定で高速化
df["date_fast"] = pd.to_datetime(df["date_raw"], format="%Y-%m-%d", errors="coerce")

print(df)
print(df.dtypes)

形式がバラバラでも自動で解釈してくれるのが強力。

format="%Y-%m-%d"を指定すると高速化できます。

カテゴリ型 astype("category")

カテゴリ型はメモリ効率を上げ、特にグループ処理が速くなります。

import pandas as pd

df = pd.DataFrame({
    "grade": ["gold", "silver", "bronze", "gold", "silver", "bronze"]
})

# カテゴリ化(順不同)
df["grade_cat"] = df["grade"].astype("category")

# 順序つきカテゴリ(ビジネス意味を持たせる)
cat_order = pd.api.types.CategoricalDtype(categories=["bronze", "silver", "gold"], ordered=True)
df["grade_ordered"] = df["grade"].astype(cat_order)

# コード(整数ラベル)も取得可能
df["grade_codes"] = df["grade_ordered"].cat.codes

print(df)
print(df.dtypes)

ユニーク値が少ない列(性別・地域・商品IDなど)に有効。

数値でのラベルエンコーディングにも使える。

複数列を一括変換

辞書を渡すことで一度に変換できます。

import pandas as pd

df = pd.DataFrame({
    "col1": ["1", "2", "3"],
    "col2": ["10.5", "20.1", "30.2"],
    "col3": [0, 1, 0]
})

df = df.astype({"col1": "int64", "col2": "float32", "col3": "bool"})

print(df.dtypes)
print(df)

よくある注意点

  • 数値変換のエラー: "nan", "--", "abc"などの文字列をint/floatに変換するとエラー → errors="coerce"を活用
  • メモリ効率: 大規模データではfloat64float32int64int32に変換すると軽量化可能
  • 欠損値(NaN): astype(int)ではNaNがあると変換できない → Int64(nullable integer型)を使う
  • datetimeのタイムゾーン: tz_localizetz_convertで扱う

実務での使い分けまとめ

  • 確実に変換: astype()
  • エラーをNaNで処理: pd.to_numeric(errors="coerce")
  • 日付変換: pd.to_datetime()
  • カテゴリ最適化: astype("category")
  • 自動推定: convert_dtypes()

まとめると、Pandasでの型変換は「正確さ」「エラー処理」「効率性」を意識して使い分けるのがポイントです。

以上、PythonのPandasの型変換についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次