Pandas & NumPy Academy · レッスン

astype()による型変換

astype()を使って列をint、float、string、boolean、datetimeに変換し、よくある変換エラーに対処します。

レッスン 2/413 ステップ

「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     bool

astype()でエラーを処理する

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.0

Pandasの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 here

dtypeマップで変換を検証する

複数の型変換を行った後は、実際の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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列のデータ型の確認
  2. astype()による型変換
  3. カテゴリ型
  4. 日付の正しい解析
← Pandas & NumPy Academyに戻る