Tech カテゴリのイメージ

ValueError: could not convert string to float の対処

このエラーは、float() や astype(float) に、数値として解釈できない文字列(空文字、“1,234”のようなカンマ入り、“N/A”、全角数字など)を渡したときに出ます。エラー文の末尾に問題の文字列そのものが表示されるので、まずそれを見て、除去・置換するか、pandasなら pd.to_numeric(errors=“coerce”) で吸収します。

ValueError: could not convert string to float: '1,234'

原因

CSVやExcel由来のデータには、見た目は数値でも文字列としては変換できないものが混ざりがちです。

・桁区切りのカンマ(“1,234”) ・空文字や空白だけのセル ・“N/A” ”-” “不明” などの欠損表現 ・全角数字や単位付き(“123” “45kg”)

float() は数値・小数点・符号・指数表記以外を受け付けないため、これらで失敗します。

対処

  1. エラー文の末尾に出る実際の値を確認します。そこに犯人がそのまま書いてあります。

  2. 単発の変換なら、変換前に置換・除去します。

s = "1,234"
v = float(s.replace(",", ""))
  1. pandasの列ごと変換なら、pd.to_numeric の errors=“coerce” が便利です。変換できない値はNaNになるので、後からまとめて処理できます。
df["price"] = pd.to_numeric(df["price"].str.replace(",", ""), errors="coerce")
print(df["price"].isna().sum()) # 変換できなかった件数を把握
  1. read_csv の段階で対処する手もあります。桁区切りは thousands、欠損表現は na_values で吸収できます。
df = pd.read_csv("data.csv", thousands=",", na_values=["N/A", "-", "不明"])

まとめ

・原因は数値に変換できない文字列(カンマ・空文字・N/A・全角)の混入 ・エラー文の末尾に問題の値がそのまま出ている ・pandasは pd.to_numeric(errors=“coerce”) でNaNに落とすのが定石 ・read_csv の thousands / na_values で入口から潰すのも有効