型混在・強制的に数値やNaNに変換 to_numeric()

投稿者: | 2022-01-12

目次

型が混在するケース

混在なしの場合(列:int)

通常(混在なしの場合)

文字列(文字列の空白含む)が混在(列:int)

  • int に文字列(空白含む)が混在すると int と str が混在するから「Object型」になる
文字列が混在

NaNが混在する場合(列:int)

  • int に、本物の NaN が混在する場合、その列全体は「float型」になる
np.nanが混在-1

NaNが混在する場合(列:str)

  • str に、NaNが混在しても元が object ばかりなのでわかりにくい
np.nanが混在-2

列を全て int に変換 pd.to_numeric()

  • pd.to_numeric(Series, 型)は、変換対象はSeriesになる。DataFrameではないので注意

https://pandas.pydata.org/docs/reference/api/pandas.to_numeric.html

  • errorsは、”ignore”, “raise”, “coerce” の3種類の値を取ります。
  • “raise” がデフォルトで、これを指定すると普通に例外が発生します。
  • “ignore” は例外を抑えますが、何の変換もせず、そのままのオブジェクトを返します。
  • “coerce” は、数値に変換できるものは変換して、そうでないものはNaNにしてくれます。

errors=’ignore’(変換なし)

  • 例外を出せないだけで、列は object のまま。変換しない
# 文字列が含まれるとobject型になる。ignoreは何も変換しない
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')

erros=’coerce’(強制的に数値へ)

  • 数値に変換不可な文字列は、NaN になる。列の型は float になる
# 強制的に数値に変換できる。数値に変換不可な文字列はNaNになる

pd.to_numeric(s, errors='coerce')
s = pd.Series(['1.0', '2', -3])
# ノーマルだとこんな感じ、デフォルトでfloat64(またはint64)
pd.to_numeric(s)

downcast=’integer’(最小位のintへ)

  • float ではなく 最小位の int にしたい場合
# 値を保持できる最小のint型にダウンキャストする
pd.to_numeric(s, downcast='integer')

downcast=’float’(最小位のfloatへ)

# 値を保持できる最小のfloat型にダウンキャストする(float16ではないんだ...)
pd.to_numeric(s, downcast='float')

その他(未確認)

# signedもintergerと同様か?
pd.to_numeric(s, downcast='signed')
# unsignedも用途がいまいちわからず
pd.to_numeric(s, downcast='unsigned')