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"
を活用 - メモリ効率: 大規模データでは
float64
→float32
、int64
→int32
に変換すると軽量化可能 - 欠損値(NaN):
astype(int)
ではNaNがあると変換できない →Int64
(nullable integer型)を使う
- datetimeのタイムゾーン:
tz_localize
やtz_convert
で扱う
実務での使い分けまとめ
- 確実に変換:
astype()
- エラーをNaNで処理:
pd.to_numeric(errors="coerce")
- 日付変換:
pd.to_datetime()
- カテゴリ最適化:
astype("category")
- 自動推定:
convert_dtypes()
まとめると、Pandasでの型変換は「正確さ」「エラー処理」「効率性」を意識して使い分けるのがポイントです。
以上、PythonのPandasの型変換についてでした。
最後までお読みいただき、ありがとうございました。