用語比較
astypeとto_numericの違い|変換できない値の扱いとerrors(pandas・Python3データ分析)
astype は、DataFrame や Series を指定した dtype(データ型)へ変換するメソッドです。一方の to_numeric は、数値型への変換に特化した関数で、errors と downcast で挙動を調整します。
数値にできない文字列が混ざっていると、既定ではどちらも例外になります。後者だけが、errors='coerce' の指定でその値を NaN にして先へ進められます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
astypeとto_numericの要点
astype
公式の説明は「指定した dtype へ pandas のオブジェクトを変換する」。列ごとに別の dtype を、辞書(列名→dtype)で指定できる。
to_numeric
数値型への変換に特化した関数。errors='coerce' で変換できない値を NaN にでき、downcast でより小さい数値型にできる。
違いを表で確認
| 比較軸 | astype | to_numeric |
|---|---|---|
| 変換先 | str、numpy の dtype、Python の型などを指定する。category への変換もできる | 数値型だけ。既定の戻りは float64 か int64 |
| 列ごとの指定 | 辞書(列名→dtype)で、列ごとに別の型を指定できる | 引数に渡した1つのスカラー、リスト、1次元配列、Index、Series を変換する |
| 変換できない値 | 既定の errors='raise' で例外になる | 既定の errors='raise' では ValueError。errors='coerce' なら NaN になる |
| 型を小さくする | dtype に int32 などを直接指定する | downcast で、整数・符号なし・浮動小数点の最小の型にする |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
文字列の列に「apple」のような値が混ざっていた人
数値にできない値があると、既定の errors='raise' では ValueError になります。to_numeric に errors='coerce' を指定すると、その値だけが NaN になり、残りは数値に変わります。
複数の列を、別々の型にまとめて変えたい人
astype に辞書(列名→dtype)を渡すと、列ごとに別の dtype を指定できます。公式の例では、col1 だけを int32 にして col2 はそのままにしています。
メモリを減らすため数値型を小さくしたい人
to_numeric の downcast を使います。公式の例では、downcast='signed' で int8、downcast='float' で float32 になります。
具体例で使い分ける
例 1
astype: 列ごとに型を指定する
公式の例のとおり、d={'col1':[1,2],'col2':[3,4]} から DataFrame を作ります。dtypes は col1 も col2 も int64 です。
- df.astype('int32') は、すべての列を int32 にします。
- df.astype({'col1':'int32'}) は、col1 だけを int32 にします。col2 は int64 のままです。
結論: astype は、全列にも列ごとにも dtype を指定できます。
例 2
to_numeric: 変換できない値を NaN にする
公式の例のとおり、s=pd.Series(['apple','1.0','2',-3]) を変換します。
- pd.to_numeric(s, errors='coerce') の結果は、
NaN、1.0、2.0、-3.0 で、dtype は float64 です。 - 'apple' のように数値にできない値は
NaNになります。 - errors の既定は 'raise' で、数値以外の値があると
ValueErrorになります。
結論: to_numeric は、errors='coerce' で変換できない値を NaN にします。
例 3
to_numeric: downcast で型を小さくする
公式の例のとおり、s=pd.Series(['1.0','2',-3]) を変換します。
- pd.to_numeric(s) の結果は 1.0、2.0、-3.0 で、dtype は float64 です。
- downcast='float' を指定すると dtype は float32、downcast='signed' を指定すると、値は 1、2、-3 で dtype は int8 になります。
結論: downcast で、可能な最小の数値型にできます。
問題文から答えを選ぶ手順
- 1
変換先を確認する
数値以外(category など)や、列ごとに別の型なら astype。数値型への変換なら to_numeric も使えます。
- 2
変換できない値の有無を確認する
数値にできない文字列が混ざっているなら、to_numeric の errors='coerce' で
NaNにして、あとで欠損値として扱います。 - 3
型の大きさを確認する
メモリを抑えたいなら、to_numeric の downcast か、astype の dtype 指定で小さい型にします。
試験での見分け方
- 1astype は、指定した dtype へ pandas のオブジェクトを変換する。辞書で列ごとに型を変えられる。
- 2to_numeric は、数値型への変換に使う。すでに数値の dtype なら dtype は保たれる。
- 3to_numeric の errors の既定は 'raise'。数値にできない値があると
ValueErrorになる。 - 4errors='coerce' を指定すると、変換できない値は
NaNになる。 - 5downcast は、整数・符号なし・浮動小数点の最小の型にする。
誤答しやすい選択肢
to_numeric が、何も指定せず文字列を飛ばしてくれると考える
修正: 既定の errors='raise' では ValueError になります。変換できない値を NaN にするには errors='coerce' を指定します。
astype でも errors='coerce' が使えると考える
修正: 公式の errors の選択肢は raise と ignore で、coerce はありません。coerce は to_numeric の選択肢です。
to_numeric は列ごとに別の型を指定できると考える
修正: to_numeric は引数を数値型に変換する関数です。列ごとに別の型を指定したいときは、astype に辞書を渡します。
確認問題
Q1pd.to_numeric(pd.Series(['apple','1.0','2',-3]), errors='coerce') で 'apple' はどうなるか?
答え: NaN になる
公式の例の結果は NaN、1.0、2.0、-3.0 で、dtype は float64 です。
Q2to_numeric の errors の既定値は?
答え: 'raise'(数値にできない値があると ValueError)
公式は、errors='raise' が既定で、無効な値があると例外が発生すると説明しています。
Q3DataFrame の col1 だけを int32 にして col2 はそのままにする書き方は?
答え: df.astype({'col1':'int32'})
astype に辞書(列名→dtype)を渡します。公式の例では col2 は int64 のままです。
Q4Series(['1.0','2',-3]) に to_numeric(s, downcast='signed') を使うと dtype は?
答え: int8
公式の例の結果です。downcast='float' なら float32 になります。
到達チェック
- astype の辞書による列ごとの型指定を書ける
- to_numeric の errors の既定値を言える
- errors='coerce' が何をするかを説明できる
- downcast で型が小さくなることを例で言える
関連ページで確認する
同じ資格で次に知りたいこと
- fit_transformとtransformの違い|テストデータにfitしない理由(Python3データ分析)
scikit-learnのfit_transformとtransformの違いを、学習用とテスト用の使い分け、データリーク、Pipelineで整理します。scikit-learn公式で照合した例と確認問題つき。
- StandardScalerとMinMaxScalerの違い|平均0・分散1と0〜1の範囲(scikit-learn)
scikit-learnのStandardScalerとMinMaxScalerの違いを、変換の式、変換後の値の範囲、外れ値の影響、新しいデータの扱いで整理します。scikit-learn公式の例で照合した確認問題つき。
- scikit-learnの変換器と推定器の違い|transformとpredictの使い分け(Python3データ分析)
scikit-learnの変換器(StandardScalerなど)と推定器(RandomForestClassifierなど)の違いを、transformとpredict、出力、Pipelineでの並びで整理します。scikit-learn公式Getting Startedで照合した例と確認問題つき。
よくある質問
Qastype と to_numeric の違いは?
astype は指定した dtype へ変換し、辞書で列ごとに型を変えられます。to_numeric は数値型への変換に特化し、errors='coerce' で変換できない値を NaN にできます。
Q数値にできない値を NaN にして変換するには?
pd.to_numeric(s, errors='coerce') を使います。公式の例では 'apple' が NaN になります。
Q変換後の NaN はどう扱いますか?
dropna で削除するか、fillna で補完します。
Qデータ分析試験の範囲?
本サイトの第4章pandasで扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
