astype()による型変換
astype()を使って列をint、float、string、boolean、datetimeに変換し、よくある変換エラーに対処します。
「astype()による型変換」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
astype()の概要
Series.astype(dtype)は、列を現在の型から指定した型に変換します。元のSeriesを変更せず、新しいSeries(DataFrame全体に対して呼び出した場合はDataFrame)を返します。データ読み込み後のdtypeの問題を修正するための、Pandasの主要なツールです。数値型同士の変換、文字列やブール型への変換、Categorical型への変換に使用できます。
import pandas as pd
df = pd.DataFrame({'age': ['25', '30', '35']})
print('Before:', df['age'].dtype) # object
df['age'] = df['age'].astype(int)
print('After:', df['age'].dtype) # int64
print(df['age'] + 1) # [26, 31, 36] — arithmetic now works数値型への変換
最も一般的な変換は、objectから数値型への変換です。'int64'、'int32'、'float64'、'float32'などにキャストできます。列内に変換できない値があると、astype()はValueErrorを発生させます。数値以外の文字列が含まれる可能性がある場合は、代わりにpd.to_numeric(series, errors='coerce')を使ってください。不正な値をNaNに変換するため、エラーで処理が停止しません。
import pandas as pd
df = pd.DataFrame({'price': ['10.5', '20.0', 'N/A', '30.5']})
# astype would crash on 'N/A'
# price_float = df['price'].astype(float) # ValueError!
# pd.to_numeric with errors='coerce' is safer
df['price_float'] = pd.to_numeric(df['price'], errors='coerce')
print(df)
# price price_float
# 0 10.5 10.5
# 1 20.0 20.0
# 2 N/A NaN
# 3 30.5 30.5文字列(object)への変換
列をstr(または'object')にキャストすると、すべての値が文字列表現に変換されます。数値列とテキスト列を連結する場合や、IDのゼロ埋めなど、数値データに文字列メソッドを適用する場合に便利です。Pandasには新しい'string' dtypeもあり、テキスト列の欠損値をより適切に扱えます。
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'region': ['E', 'W', 'N']})
# Concatenate id and region into a composite key
df['key'] = df['id'].astype(str) + '_' + df['region']
print(df)
# id region key
# 0 1 E 1_E
# 1 2 W 2_W
# 2 3 N 3_Nブール型への変換
列にTrue/Falseが整数(0/1)や文字列('Yes'/'No')として格納されている場合、ブール型への変換が役立ちます。astype(bool)を使って0/1の整数をキャストすると、0はFalse、それ以外の値はTrueに直接変換されます。'Yes'/'No'の文字列列では、まず辞書でmapしてからキャストしてください。
import pandas as pd
df = pd.DataFrame({
'active_int': [1, 0, 1, 0],
'active_str': ['Yes', 'No', 'Yes', 'No']
})
# Integer to bool
df['active_bool'] = df['active_int'].astype(bool)
# String to bool via mapping
df['active_bool2'] = df['active_str'].map({'Yes': True, 'No': False})
print(df[['active_bool', 'active_bool2']])
# active_bool active_bool2
# 0 True True
# 1 False False数値型のダウンキャスト
Pandasはデフォルトで64ビット型を使用します。整数値が32ビット、あるいは8ビットに収まる場合は、より小さい型にダウンキャストすることでメモリ使用量を半分(または4分の1)にできます。pd.to_numeric(series, downcast='integer')を使うか、astype('int32')で明示的にキャストしてください。これは大規模なデータセットにおける重要な最適化です。
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': np.random.randint(0, 200, 1_000_000)})
print('int64 bytes:', df['count'].nbytes) # 8,000,000
df['count_int16'] = df['count'].astype('int16') # max 32767, fits 0-200
print('int16 bytes:', df['count_int16'].nbytes) # 2,000,000
# Or let Pandas choose the smallest type automatically
df['count_auto'] = pd.to_numeric(df['count'], downcast='integer')
print('auto dtype:', df['count_auto'].dtype)astype(dict)でDataFrame全体を変換する
df.astype()に辞書を渡すと、複数の列を一度に変換できます。辞書のキーには列名、値には変換先のdtypeを指定します。列ごとの代入を個別につなげるよりも見やすく、型変換の処理をパイプライン内の1つのブロックとして自己説明的に記述できます。
import pandas as pd
df = pd.DataFrame({
'age': ['25', '30'],
'salary': ['50000', '70000'],
'is_manager': ['1', '0']
})
df = df.astype({
'age': 'int32',
'salary': 'float64',
'is_manager': 'bool'
})
print(df.dtypes)
# age int32
# salary float64
# is_manager boolastype()でエラーを処理する
astype()には、pd.to_numericとは異なり、組み込みのエラー許容モードがありません。変換に失敗すると、ValueErrorまたはOverflowErrorが発生します。安全な手順は、(1)最初に列をクリーニングする(記号を除去し、NaNを補完する)、(2)その後でキャストする、というものです。別の方法として、数値にはpd.to_numeric(errors='coerce')を使うか、変換エラーを捕捉する小さなヘルパー関数を作成します。
import pandas as pd
# Clean then cast pattern
df = pd.DataFrame({'price': ['$1,200', '$800', '$450']})
# Step 1: remove non-numeric characters
df['price_clean'] = (
df['price']
.str.replace('$', '', regex=False)
.str.replace(',', '', regex=False)
)
# Step 2: safe cast
df['price_num'] = df['price_clean'].astype(float)
print(df)
# price price_clean price_num
# 0 $1,200 1200 1200.0
# 1 $800 800 800.0
# 2 $450 450 450.0PandasのStringDtypeにキャストする
新しい'string' dtype(大文字のSを使うバリエーション、またはpd.StringDtype())は、適切なNA処理を備えた本格的な文字列サポートを提供するために導入されました。欠損文字列をNoneやnp.nanではなくpd.NAとして格納します。object dtypeよりもNAの意味を適切に保ちながら.strアクセサを利用できるため、Pandas 2以降を対象とする新しいコードで推奨されます。
import pandas as pd
df = pd.DataFrame({'name': ['Alice', None, 'Carol']})
# Convert to the modern string dtype
df['name'] = df['name'].astype('string')
print(df['name'].dtype) # string
print(df['name'].isna()) # proper NA detection
# 0 False
# 1 True
# 2 Falseダウンキャスト時のオーバーフローのリスク
より小さい整数型にダウンキャストすると、その型の範囲を超える値はオーバーフローし、エラーにならずに循環して別の値になります。たとえば、300をint8(範囲は-128~127)にキャストすると、エラーなしで44になります。予期しないデータ破損を避けるため、ダウンキャストする前に、実際のデータ範囲が変換先の型に収まることを必ず確認してください。
import pandas as pd
import numpy as np
df = pd.DataFrame({'value': [100, 200, 300, 127, 128]})
# int8 range: -128 to 127
df['value_i8'] = df['value'].astype('int8')
print(df)
# value value_i8
# 0 100 100
# 1 200 -56 <- overflow! 200-256 = -56
# 2 300 44 <- overflow! 300-256 = 44
# 3 127 127
# 4 128 -128 <- overflow!
# Always check range first
print(df['value'].max()) # 300 > 127 — int8 is UNSAFE heredtypeマップで変換を検証する
複数の型変換を行った後は、実際のdtypeと期待するマップを比較して、最終的なスキーマを検証してください。このアサーションパターンにより、NaNのために整数型への変換に失敗した列などのミスを検出できます。軽量なスキーマテストとして、データ読み込み関数の最後にこれらのチェックを実行してください。
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 3],
'amount': [10.5, 20.0, 30.5],
'active': [True, False, True]
})
expected = {'user_id': 'int64', 'amount': 'float64', 'active': 'bool'}
for col, dtype in expected.items():
assert str(df[col].dtype) == dtype, (
f'{col}: expected {dtype}, got {df[col].dtype}'
)
print('Schema validation passed')完全な変換パイプラインの例
ここまでの内容をまとめて、read_csv後に書式をクリーニングし、NaNを安全に処理し、最適な型にキャストして、結果を検証する現実的な変換パイプラインを見てみましょう。この「クリーニング、キャスト、検証」というパターンは、すべてのデータ取り込み関数に標準的に組み込むべきです。
import pandas as pd
raw = pd.DataFrame({
'user_id': ['101', '102', '103'],
'revenue': ['$1,200', '$800', '$2,500'],
'active': ['Yes', 'No', 'Yes']
})
df = (
raw
.assign(
user_id=raw['user_id'].astype('int32'),
revenue=pd.to_numeric(
raw['revenue'].str.replace('[$,]', '', regex=True)
),
active=raw['active'].map({'Yes': True, 'No': False})
)
)
print(df.dtypes)
# user_id int32
# revenue float64
# active boolクイックチェック
astype()によるキャストについて理解度をテストしましょう。
レッスンのまとめ
このレッスンでは、astype(dtype)で列またはDataFrame全体を新しい型に変換できること、pd.to_numeric(errors='coerce')が数値以外の文字列を含む列に対してより安全であること、辞書をastype()に渡すと複数の列を一度に変換できることを学びました。オーバーフローを避けるためダウンキャストは慎重に行い、アサーションで最終的なスキーマを必ず検証してください。次は、メモリ効率に優れたCategorical dtypeについて学びます。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「astype()による型変換」レッスンは無料ですか?
はい。「astype()による型変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「astype()による型変換」で何を学びますか?
astype()を使って列をint、float、string、boolean、datetimeに変換し、よくある変換エラーに対処します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「astype()による型変換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。