pandasでastype(int)するとNaNでエラーになる原因と対処法を試した話

Pythonを実務で使い始めます。CSVを読み込んでデータを整理する機会が増加するはずです。特に経理や総務の仕事でよくある光景でしょう。基幹システムから吐き出されたリストを扱います。注文履歴の整理なども発生します。意気揚々とプログラミングを始めてみてください。途端によくわからない英語のエラーが出現します。作業が止まってしまうこともあるのです。

実は私も同じような経験を持っています。会員番号の列を整数に変換しようと試みました。それだけで数時間も立ち往生してしまったのです。画面に表示されたのは「ValueError」でした。原因を突き止めるまで時間がかかります。自分の書いたコードのどこが間違っているのでしょうか。全く分からずに途方に暮れていました。

本日はpandasでのエラー原因を紹介します。「astype(int)」を使ったときの話です。実務で使える4つの解決策を詳しくお伝えしましょう。非エンジニアの視点で手順をまとめてみました。私が実際に試行錯誤して辿り着いた内容です。読み終える頃には、空欄の扱い方を決めるだけでこのエラーは抜けられると分かるはずです。

会員番号の整数変換エラー

まずは私が直面した状況をお話しします。社内のシステムから顧客リストをダウンロードしました。これを読み込み会員番号の列を加工しようと試みます。会員番号はもともと「1001」のような数字です。しかしpandasで読み込むとおかしくなりました。なぜか「1001.0」と表示されていたのです。

そこで私は見た目を整えようと考えました。「astype(int)」という命令を使います。整数型に変換しようとしたわけです。ところが実行した瞬間に赤い文字が出現しました。長いエラーメッセージが吐き出されます。処理が完全に止まってしまったのです。

会員番号の小数点が気になります。軽い気持ちでastype(int)を実行してみました。すると見たこともない長いエラー文が出ます。Jupyter Notebookが真っ赤に染まりました。何が起きたのか全く理解できません。とりあえずブラウザを閉じて深呼吸したのを覚えています。

ちなみに扱っていたCSVは1万行ほどあり、手作業では直す気になれない量でした。

なぜか整数化できない列

当時の私には理由が全く理解できませんでした。数字を整数に変えるだけの簡単な操作です。なぜそれでエラーが出るのでしょうか。他の列ではうまくいくのに不思議でなりません。この特定の列だけが頑なに拒否してきます。結局その日は原因が分かりませんでした。手作業でExcelを開いて修正することになります。

VS Codeのターミナル画面です。赤背景の白抜き文字でValueErrorが表

NaNが阻む整数変換

表示されたエラーをよく見てみましょう。「Cannot convert non-finite values」と書かれています。英語が苦手な私は翻訳ツールを使いました。すると日本語の意味が判明します。「有限ではない値を整数に変換できません」とのことです。

ここでいう「有限ではない値」を考えます。今回のケースでは「NaN」と呼ばれる欠損値でした。つまり会員番号の列に空っぽのセルがあったのです。

しかしExcelで確認したときは空欄に見えました。それがPythonの世界に入ると変化します。「NaN」という特別な存在になるのです。これが整数の型に変換するのを邪魔していました。このエラーはpandasからの悲鳴のようなものです。「空っぽがあるのにどうやって整数にするんだ」という声でしょう。原因が特定できて少し安心しました。しかし今度は新しい悩みに直面します。「どうやってこの空っぽを扱えばいいのか」という問題です。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

整数変換できないNaNとpandasの型判断

なぜNaNがあると整数に変換できないのでしょうか。その理由はPythonやpandasの仕様にあります。「int64」という型が欠損値を表現できないのです。標準的な整数の型には前提条件が存在します。それは必ず何らかの数字が入っていることでした。

一方で「float64」という型を見てみましょう。こちらは小数を扱うことが可能です。そしてNaNを適切に処理できます。そのためCSV読み込み時に影響が出ました。一箇所でも空欄があるとpandasが判断します。列全体を気を利かせてfloat型にしてしまうのです。

最初はPCのメモリ不足だと思い込んでいました。あるいはPythonのバージョンが古いせいだと疑います。無駄に再インストールを繰り返しました。しかし原因はデータの中に潜んでいたのです。「空っぽのセル」が犯人だと気づきました。自分の知識不足を痛感することになります。

読み込み時の型判別と欠損値の罠

次に私が確認したのは読み込み直後のデータ型です。自分では整数だと思い込んでいた列がありました。実は最初からfloat型として認識されていたのです。Jupyter Notebookなどでデータを表示させます。すると右端に「dtype: float64」と出ました。

Jupyter Notebookのセルに日本語で情報が出ています。「df.inf

そこでなぜ勝手にfloat型になるのか調べます。pandasには「read_csv」という関数が存在するのです。これはデータを自動判別する仕組みを持っています。「空欄があるならfloatにしよう」と判断するわけです。

つまりエラーが出たのは変換しようとした時です。しかし種は読み込んだ時にすでに撒かれていました。もともとシステム側では整数として扱っていたはずです。それがCSVを経由してPythonに渡った瞬間に変わります。これは非エンジニアが最もハマりやすい罠でしょう。もしすべての行に値が入っていればどうでしょうか。最初からint型で読み込まれたはずです。しかし実務のデータに欠損は付きものになります。この自動判別の仕組みを理解することが重要です。まずはデータの型がどうなっているか確認します。読み込み直後にチェックする習慣がつきました。

fillnaで欠損値を整数化

それでは具体的な解決策を試していきましょう。まず最もシンプルな方法を紹介します。それは欠損値をあらかじめ別の数字で埋めることです。これには「fillna」という関数を使います。

たとえば欠損している箇所に「0」を入れましょう。これで列の中にNaNが存在しない状態になります。その後に「astype(int)」を実行してみてください。エラーを出さずに整数へ変換できるはずです。

会員番号が空欄の箇所に「0」を入れます。これには少し抵抗がありましたが試してみました。まずはエラーを消すことが最優先だったからです。コードを書くと苦労したエラーが嘘のように消えます。綺麗な整数の列に変わったときは大きな喜びを感じます。画面の前で思わずガッツポーズをしてしまいました。

データ整形:欠損値と混在データへの対処

しかし実務では様々な要望が存在するはずです。「勝手に0で埋めたくない」という場面も多いでしょう。「空欄は空欄のままにしておきたい」こともあります。そこで次に試したのが別の方法になります。pandasに導入された「Nullable Integer」を使ってみました。

通常の「int64」はNaNを扱うことができません。しかし「Int64」という型を使うと状況が変わります。なんと欠損値を保持したまま整数として扱えるのです。

通常のint型と比べてメモリの使い方は少し変わるようですが、私の扱う量では体感で困ることはありませんでした。

これを見つけたときは、ずっと探していた答えにやっと出会えた気がしました。使い方はとても簡単で、書き替えるだけで済みます。「astype(‘Int64’)」と記述してください。シングルクォーテーションで囲むのがポイントです。そして頭文字を大文字にするのを忘れないでください。この方法なら欠損値がある行は「

Int64で数値の見た目と正確性 pd.to_nume…

」となります。それ以外の行は小数点が消えた綺麗な整数になるのです。データとしての正確さを保つことができるわけでしょう。見た目も整数に整えることが可能です。現在の私の業務ではこの方法がメインの選択肢となります。ただし古いバージョンの環境では動作しません。そこだけは注意が必要になります。

pd.to_numericのNaN強制変換

さらにデータを詳しく見ていくと厄介な問題に気づきます。数値とNaN以外のデータが存在したのです。時折「不明」といった文字列が混ざっていました。こうなると「astype」では太刀打ちできません。そんな時に助けてくれた関数があります。それは「pd.to_numeric」というものです。これの凄いところはオプションに存在します。「errors=’coerce’」を付けられる点です。CSVの中に全角の数字が混ざっていました。また「-」などの記号も存在しており厄介です。何度直してもエラーが止まらず苦労しました。pd.to_numericを教えてもらい試してみます。

エラーを強制的にNaNに変える設定で実行しました。するとゴミデータが一掃されて計算可能になったのです。この設定を使うと変な文字列を処理できます。すべて強制的に「NaN」に置き換えてくれるのです。まずはこの関数でデータをクレンジングします。その後に先ほどの「Int64」への変換を行いました。このような二段構えの手順を踏んだわけです。

Pythonのコードエディタ画面の日本語版です。「astype('Int64')

不純物除去と型整理の極意

複雑な業務データは一筋縄ではいきません。無理に一つの命令で解決しようとしないでください。まずは不純物を取り除くことが大切です。それから型を整えるという考え方が近道になります。おかげでどんなに汚いデータにも対応できるようになりました。パニックにならずに対処できる自信がついたのです。

欠損値行削除の是非と注意点

最後にもう一つ試した方法を紹介します。それは欠損値が含まれる行そのものを削除することです。これには「dropna」という命令を使います。そもそも会員番号が入っていないデータもあるでしょう。それは分析に必要ないと割り切る時に有効です。

「df.dropna(subset=[‘列名’])」と実行します。その列が空欄の行を丸ごと取り除くことができるはずです。データフレームから綺麗に消去されます。

行を消してしまえば残ったデータにはNaNが含まれません。そのため心置きなく整数に変換することができます。「astype(int)」を使っても問題ありません。この方法は非常に潔いやり方だと言えるでしょう。計算結果が狂う心配も一切存在しません。ただしデータ件数が減ってしまうリスクがあります。元のデータが1000件あったとしましょう。欠損行を消したら500件になる事態も起こり得ます。実務では理由を上司に説明しなければなりません。「なぜデータが減ったのか」と聞かれる場面もあります。そのため安易に行を消すのは推奨できません。事前に無効として扱って良いか確認してください。私はこの方法を試す際は必ずメモを取ります。削除前の行数と削除後の行数を比較するのです。納得感を持って作業を進めるようにしています。

欠損データ処理の判断基準

さてここまで4つの対処法を見てきました。結局どれを使えば良いか迷うかもしれません。私は自分の経験から判断基準を作りました。まず欠損箇所に意味を持たせたい場合があります。未回答を0とみなすようなケースです。この場合は「fillna」が最適でしょう。最もシンプルでその後の計算もスムーズに進みます。次に欠損は欠損として残したい場合を考えます。見た目だけを整数にしたい状況です。その時は「Int64」を選んでください。これがデータの透明性を最も高める方法となります。またデータが汚れている場合もあるでしょう。文字列などが混入している厄介なケースです。

その時は「pd.to_numeric」でお掃除をします。そして明らかに不要な欠損データが含まれている時です。分析用途なら「dropna」で削除してしまいましょう。最初はどの方法も同じに見えていました。そのため手当たり次第に試していたのです。しかしある時「Int64」で処理したデータを出力しました。Excelにして他部署に渡したところ感謝されます。

Excelのような表形式の日本語データです。空欄がある行に赤いバツ印がついていま

データの「出口」と手法の学び

非常に見やすいと言ってもらえたのです。そこからデータの「出口」を意識するようになりました。手法を選ぶ大切さを学んだ瞬間です。処理速度の差は、私が扱う数千行ほどのデータではほとんど感じませんでした。

データ型の最終確認

最後に一連の処理が終わった後の大事なステップをお伝えします。それは自分が意図した型に変換されたかどうかの確認です。自分の目でしっかりとチェックしてください。

せっかく「Int64」に変換したつもりでも油断は禁物です。途中の代入ミスなどで型が元に戻ることが稀にあります。私は処理の最後に必ず確認コマンドを入力しました。「df.dtypes」と書いて型の一覧を表示させるのです。

dtypeチェックでエラー激減

VS Codeのデバッグコンソール画面です。日本語の列名とそのデータ型がリストで

ここで「float64」の文字が消えているか見ます。無事に「int64」や「Int64」になっていれば合格です。この一分足らずの確認作業を怠らないでください。後続のプログラムでまた別のエラーが出る可能性があります。私はそれで何度も手戻りを経験してきました。「プログラムは書いた通りに動く」という言葉があります。しかし「思った通りには動かない」のも事実です。まさにその通りで思い込みを排除する必要があります。データの状態を客観的に見ることは非常に重要でしょう。型を確認して初めて自分の仕事が完了したと言えます。この確認のクセをつけてから大きな変化がありました。エラーでイライラする時間が格段に減ったのです。落ち着いてコードに向き合えるようになりました。皆さんも最後の「dtypeチェック」をセットにしてください。確実に作業を進めていきましょう。

astype(int) エラーの攻略法

今回は「astype(int)」を実行した際のエラーについて解説しました。原因と対処法を私の実体験を交えて紹介しています。最初は絶望的な気分にさせる赤いメッセージが出るはずです。しかし中身を紐解けば要求は非常にシンプルです。「欠損値をどう扱うか決めてほしい」という真っ当な声でした。

非エンジニアが学ぶ過程で型の問題は避けて通れません。これは必ずぶつかる壁だと言えるでしょう。しかし今日ご紹介した4つの武器を持っていれば安心です。fillnaやInt64などを使いこなしてください。もうエラーメッセージを怖がる必要はありません。大切なのは目の前のデータがどうあるべきか考えることです。自分なりに定義することが解決の糸口になります。

エラーに遭遇したときは成長のチャンスだと捉えましょう。私も最初は一つのエラーに数時間費やしていました。しかし今では解決する過程が楽しく感じられます。まるでパズルを解くような感覚です。業務の自動化には小さなつまずきが付きものになります。それを乗り越えた先に、作業がぐっと楽になる瞬間が待っています。私もまだ手探りですが、同じところで止まっている人の助けになればうれしいです。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Python業務自動化関連書籍を、手元で見返せる形にしておきたい場合

Pythonやデータ処理の自動化は、作りながら同じ基礎を何度も確認する場面が多いです。手元で見返せる本があると、調べ直しの時間を減らしやすいです。

Python業務自動化関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →


[アンケート] この記事は役に立ちましたか?


1問だけ回答する