pandasで型を変換するための四つの主なオプションがあります。
これらの各メソッドの詳細な説明と使い方については、こちらをお読みください。
データフレームの一つ以上の列を数値に変換する最良の方法は、pandas.to_numeric()
を使用することです。
この関数は、数値以外のオブジェクト(文字列など)を必要に応じて整数または浮動小数点数に変更しようとします。
基本的な使い方
to_numeric()
への入力は、データフレームの系列または単一の列です。,
ご覧のとおり、新しいシリーズが返されます。 この出力を変数または列名に割り当てて使用し続けることを忘れないでください。
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
apply()
メソッドを使用してデータフレームの複数の列を変換することもできます。
値をすべて変換できる限り、必要なのはおそらくすべてです。
エラー処理
しかし、いくつかの値を数値型に変換できない場合はどうなりますか?,
to_numeric()
また、errors
キーワード引数を取り、数値以外の値をNaN
にするか、これらの値を含む列を無視します。
オブジェクトdtypeを持つ一連の文字列s
を使用する例を次に示します。
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
デフォルトの動作は、値を変換できない場合に発生することです。, この場合、文字列’pandas’には対応できません。
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
失敗するのではなく、’pandas’を欠けている/悪い数値と見なすことができます。, 無効な値をNaN
errors
キーワード引数を使用して、次のように無効な値を強制することができます。
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
errors
の第三のオプションは、無効な値が見つかった場合に操作を無視することです。
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
この最後のオプションは、データフレーム全体を変換したいが、どの列を確実に数値型に変換できるかわからない場合に特に便利です。, その場合は、次のように書いてください。
df.apply(pd.to_numeric, errors='ignore')
関数はデータフレームの各列に適用されます。 数値型に変換できる列は変換されますが、変換できない列(数字以外の文字列や日付を含む列など)はそのまま残されます。
ダウンキャスト
デフォルトでは、to_numeric()
変換すると、int64
またはfloat64
dtype(またはプラットフォーム,
それは通常あなたが望むものですが、float32
やint8
のように、メモリを節約してよりコンパクトなdtypeを使いたい場合はどうなりますか?
‘integer’にダウンキャストすると、値を保持できる最小の整数が使用されます。
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
‘float’にダウンキャストすると、通常の浮動小数点型よりも小さいものが選択されます。
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
astype()
メソッドを使用すると、データフレームまたはシリーズに必要なdtypeについて明示的にすることができます。, それはあなたが試してみて、他のタイプから行くことができるという点で非常に汎用性です。
基本的な使い方
変換したいオブジェクトのメソッドを呼び出すと、astype()
あなたのためにそれを変換しようとします:
私は”try”と言った気づき-astype()
シリーズまたはデータフレームの値を変換する方法がわからない場合、エラーが発生します。 たとえば、NaN
またはinf
値がある場合、整数に変換しようとするとエラーが発生します。
パンダ0.20の時点で。,0の場合、このエラーはerrors='ignore'
を渡すことで抑制できます。 あなたの元のオブジェクトはそのまま戻されます。
注意してください
astype()
強力ですが、値が”間違って”変換されることがあります。 たとえば、
これらは小さな整数なので、メモリを節約するために符号なし8ビット型に変換するのはどうですか?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
変換は機能しましたが、-7は249(つまり28-7)になるようにラップされました!
代わりにpd.to_numeric(s, downcast='unsigned')
を使用してダウンキャストしようとすると、このエラーを防ぐことができます。,
infer_objects()
pandasのバージョン0.21.0では、オブジェクトデータ型を持つデータフレームの列をより具体的な型に変換するためのメソッドinfer_objects()
たとえば、オブジェクト型の二つの列を持つDataFrameを次に示します。 一方は実際の整数を保持し、もう一方は整数を表す文字列を保持します。
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
infer_objects()
を使用すると、列’a’の型をint64に変更できます。
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
列’b’は、値が整数ではなく文字列であったため、単独で残されています。, 両方の列を整数型に変換しようとする場合は、代わりにdf.astype(int)
を使用できます。
convert_dtypes()
バージョン1.0以降には、Series列とDataFrame列をpd.NA
欠損値をサポートする最良のdtypeに変換するメソッドconvert_dtypes()
ここで、”可能な限り最良”とは、値を保持するのに最も適した型を意味します。, Python整数オブジェクトのオブジェクト列はInt64
に変換され、NumPyint32
値の列はpandas dtypeInt32
になります。,
object
DataFramedf
では、次の結果が得られます。
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
列’a’は整数値を保持していたため、Int64
タイプ(object
データフレームdf
とは異なり、欠損値を保持することができますid=”a6a2f32d4a”>
)。
列’b’には文字列オブジェクトが含まれていたため、pandas’string
dtypeに変更されました。
デフォルトでは、このメソッドは各列のオブジェクト値から型を推測します。, これを変更するには、infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
列’a’はオブジェクト列のままでした:pandasは’integer’列として記述できることを知っています(内部的にはinfer_dtype
を実行しました)が、整数のdtypeを正確に推測していなかったため、変換しませんでした。 列’b’は、’string’値を保持していると認識されたため、再び’string’dtypeに変換されました。