インプレスの「スッキリわかる Pythonによる機械学習入門」のエラー対策記事です。
書籍に記述されているコードを間違いなく入力してもエラーが発生した箇所があったので対策方法を掲載します。
エラーの要因として、書籍が出版された後も実行環境が更新されることから、執筆時点では問題なかったものが残念ながら読者が実行するときにはエラーとなるケースがあります。
エラーが解決できず モヤモヤ している人に役立てば幸いです。
エラー内容
P.151 第Ⅱ部 第5章 「分類1:アヤメの判別」 – 5.2.6 データの前処理 / 代表値の計算のコード5-13 meanメソッドで数値の列の平均値を計算
# 数値列の各平均値を計算 (文字列の列は自動的に除外してくれる)
df.mean()
を実行すると
ValueError
…
ValueError: could not convert string to float: 'Iris-setosaIris-setoasa…
とエラーが表示されます。
実行環境
エラーは、下記の環境で発生を確認しています。
- Anaconda3-2023.09-0-Windows-x86_64
- JupyterLab 3.6.3
- Python 3.11.5
- pandas 2.0.3
エラーの原因
データフレームのmeanメソッドに対するnumeric_only引数のデフォルトがFalseになっており
コードのコメントに記載の「文字列の列は自動的に除外してくれる」が機能しなくなった為です。
‘種類’列のデータは文字列なので、文字列を浮動小数点(float)に変換できずエラーとなっています。
# df.mean() と記述した場合
df.mean(numeric_only=False)
# となる
解決方法
期待結果としては「文字列の列は除外」なのでnumeric_onlyをTrueにすることで解決します。
df.mean(numeric_only=True)
pandas 1.5.2 の API referenceには、
Deprecated since version 1.5.0: Specifying numeric_only=None is deprecated.
The default value will be False in a future version on pandas.
(「numeric_only=None」を指定することは、バージョン1.5.0以降では非推奨となっています。将来のバージョンではデフォルト値はFalseになります。)
と記載されており、pandas 2.0.3ではnumeric_onlyのデフォルトはFalseになっています。
ちなみに、以下のコードに対しても同様のエラーが発生するので、numeric_only=True を追記することで解決します。
- P.256 コード7-13
- P.257 コード7-14
- P.263 コード7-19
- P.358 コード10-8
- P.400 コード11-2
- P413 コード11-11
- P.425 コード12-3
- P.451 コード12-19
- P.468 コード13-5
- P.478 コード13-9
- P.500 コード14-2
コメント