pandasで「1,800円」のような金額を数値にするには、列の単位と書式を確かめ、桁区切りが正しい行だけを整えてから to_numeric() に渡します。カンマを全部消すだけでは、「18,00」のような入力ミスまで通るため、変換できた件数と保留した元値を一緒に確認してください。

この記事は、Pythonの変数や表の読み込みを少し学び、CSV・Excelの金額列で止まっている社会人向けです。題材は編集部作成の架空の研修費一覧。実在する請求書やスクールの受講料ではありません。日本式の整数の円表記に範囲を絞り、小数、割合、外国通貨、会計上の判定は別の処理として扱います。

公式仕様・講座情報の確認日:2026年10月7日。pandasの現行公式APIでは、変換エラーの指定は raise と coerce です。掲載コードはPython 3.12.14・pandas 2.2.3で実行し、後述の件数と値を照合しました。公式文書の版と実行環境の版は分けて記載しています。

カンマ・円・全角数字を変換する前に、金額の意味をそろえる

数字に見える列が計算できない理由を、元の値から調べる

表のセルに「1,800円」と表示されていると、人は千八百円と読めます。しかし文字列には数字以外の記号が含まれます。Pythonへ渡った値が文字列なら、見た目だけで計算用の値になっているとは限りません。まず対象の列名、数行の元値、データ型を確認し、何を数値化しようとしているかを説明できるようにします。

金額の合計を求めたいのか、顧客番号を並べたいのかでも処理は違います。番号が「001800」なら、先頭のゼロは意味を持つかもしれません。金額変換用の処理を番号へ適用してはいけません。ファイルを読み込む段階で番号が変わる問題は、CSVの先頭ゼロと文字コードの確認で別に扱っています。

to_numeric() は数値への変換を行う関数です。円なのかドルなのか、単価なのか合計なのか、欠損が未精算なのかは判断しません。今回なら、列の見出しを「研修費_円」と決め、すべて税込などの条件がそろっているという教材上の前提を置きます。実務では、その前提を入力担当者や原票で確かめる工程が必要です。

エラーを消したいからといって、いきなりすべての値へ置換をかけると、元の問題を見失います。例えば「18,00」を「1800」へ変えれば計算はできますが、正しい値が1,800なのか18,000なのかは分かりません。処理できる形へ変えることと、金額を確定することを分けるのが今回の学習目標です。

作業前に、残したい情報を三つ決めてください。「入力の原文」「整形後の文字」「数値として採用するか」です。この三つを横に並べれば、何が変わったのかを自分で説明できます。原文を消して変換後の値だけ保存すると、後で疑問が出ても入力ミスと処理ミスを切り分けにくくなります。

円の整数列に許す表記と、確認へ回す表記を決める

今回の練習では、数字だけ、正しい3桁区切り、末尾に一つ付いた「円」、前後の空白、全角の数字とカンマを扱います。負数も書式としては受け入れます。ただし負数を返品や返金として扱ってよいかは、別の業務判断です。教材では調整額を表すという前提にしています。

一方、「1.8万円」「税込1,800円」「1,800円予定」「18,00」は自動変換しません。文字を削っても、単位や状態が違う可能性があります。特に「万円」は、文字を取り除くだけでは値が一万分の一になります。今回のコードはそれらを要確認へ回すため、あらゆる日本語の金額を読める万能な変換ではありません。

今回の整数円のルールと、別処理へ回す入力
入力例扱い理由
1,800円数値化の対象3桁区切りと末尾の円が規則に合う
2,400円全角を整えてから判定整形後の書式も検査する
18,00要確認カンマの位置を勝手に直さない
1.8万円要確認小数と万円は今回の単位・形式に含まない
未精算・空欄状態を残す実際のゼロとは区別する

「数字以外をすべて消す」という正規表現は短く書けますが、負号、小数点、単位、状態まで消す危険があります。「-300円」が300へ変われば合計の符号が変わりますし、「1.8万円」が18になると桁が変わります。短さより、許す形式を限定したほうが、初学者にも結果を点検しやすくなります。

このルールはデータの入力元に合わせて変えます。海外形式の「1.800,00」や、括弧で表す負数を受け取る業務には、その規則を別に設計してください。複数の形式が混じるなら入力元の列を追加し、形式ごとに処理を分ける方法もあります。見た目が似ているからといって、一つの置換式へまとめないことが大切です。

許す表記を決めたら、成功例だけでなく、止めたい例も紙に書いておきます。正常な「1,800」が通るだけでは、桁区切りの検査ができたとはいえません。「18,00」が保留され、「未精算」がゼロにならないことまで確認条件に含めます。先に期待結果を置くと、後から出力に合わせて正解を変えずに済みます。

全角を整えても、単位や桁区切りの判断は残る

全角の「2,400」を半角の「2,400」へ整える工程と、それを2,400円と採用する工程は別です。ここではPython標準の unicodedata.normalize("NFKC", ...) を使います。互換性を考慮した文字の正規化であり、金額の正しさを判定する機能ではありません。Python公式のUnicode正規化の説明で仕様を確認できます。

NFKCは全角数字以外の文字にも作用します。例えば一部の記号を別の表現へ変えることがあります。そのため、何でも読み取りたい処理へ広げるより、今回のように入力列の意味を固定し、元の文字も残して使います。人名、商品コード、法律文書の表現を同じ規則で一括して書き換える用途には流用しないでください。

前後の空白は strip() で除きます。途中の空白は除きません。「1 800」を勝手に「1800」とするルールは、今回の入力仕様に入れていないためです。末尾の「円」も一つだけを除き、「円円」や文字の説明が付く値は要確認へ回します。消す文字を増やすほどよい、という考え方ではありません。

次に、文字列全体が許可した形式に一致するか確かめます。部分的に数字が見つかっただけでは不十分です。「予定1800円」に数字があるとしても、金額が確定しているとは限りません。今回の検査には文字列全体の一致を調べる fullmatch を使い、許した範囲だけが残っていることを確認します。

正規表現は、区切りなしの整数、または先頭が1〜3桁で後ろが3桁ずつの区切り、という二通りを許します。最初に負号を付けてもよい設計です。ゼロの有効性や金額の上限はこの式だけでは決まりません。書式の検査に加えて、桁数を抑え、教材として追いやすい小さな値を扱います。

架空の8行を使い、変換成功と保留を一度に確かめる

次のコードは、ファイルの読み込みや上書きを行いません。表をメモリ上で作り、元値と結果を表示する学習用の例です。すでにpandasを利用できる環境で実行してください。自分の仕事のデータへ置き換える前に、固定サンプルで期待結果が合うかを確認します。

期待する採用額は、資料代1,800円、演習用品2,400円、会場費3,600円、調整額-300円、オンライン枠0円です。合計は7,500円。8行のうち5行が数値化でき、2行が要確認、1行が未入力となります。この合計は入力表全体の確定額ではなく、採用できた5行の小計です。

import re
import unicodedata
import pandas as pd

df = pd.DataFrame({
    "費目": ["資料代", "演習用品", "会場費", "調整額",
           "オンライン枠", "予備費", "交通費", "追加教材"],
    "原文": ["1,800円", "2,400円", " 3600 ",
           "-300円", "0", "18,00", None, "未精算"],
})
pattern = re.compile(r"-?(?:[0-9]+|[0-9]{1,3}(?:,[0-9]{3})+)")

def inspect_money(value):
    if pd.isna(value):
        return pd.NA, "未入力"
    text = unicodedata.normalize("NFKC", str(value)).strip()
    if not text:
        return text, "未入力"
    if text.endswith("円"):
        text = text[:-1]
    if not pattern.fullmatch(text):
        return text, "要確認"
    clean = text.replace(",", "")
    if len(clean.lstrip("-")) > 9:
        return clean, "要確認"
    return clean, "採用"

checked = df["原文"].map(inspect_money)
df["整形文字"] = checked.map(lambda pair: pair[0])
df["状態"] = checked.map(lambda pair: pair[1])
candidate = df["整形文字"].where(df["状態"].eq("採用"))
df["金額_円"] = pd.to_numeric(candidate, errors="raise").astype("Int64")

accepted = df.loc[df["状態"].eq("採用"), "金額_円"]
summary = {
    "全行": len(df),
    "採用": len(accepted),
    "要確認": int(df["状態"].eq("要確認").sum()),
    "未入力": int(df["状態"].eq("未入力").sum()),
    "採用行の小計_円": accepted.sum(min_count=1),
}
assert accepted.tolist() == [1800, 2400, 3600, -300, 0]
assert summary["採用行の小計_円"] == 7500
assert summary["採用"] == 5
assert summary["要確認"] == 2
assert summary["未入力"] == 1
print(df.to_string(index=False))
print(summary)

採用を決める前に全角の整形と書式の確認を行い、採用された行だけを数値変換へ渡しています。最後を errors="raise" にしているのは、検査を通した値が想定外に変換できないとき、黙って欠損へ変えずに止めたいからです。このコードでは、書式による保留を先に別の列で管理しています。

出力の欠損表示は環境によって見え方が異なることがあります。確認する中心は、5件の値、保留された2件の原文、未入力1件、小計7,500円です。型名を見て安心するだけでなく、データの内容を照合してください。Int64 は欠損を持てる整数型として使っており、普通の int64 と表記が異なります。

置換だけの処理と比べて、誤った採用がないかを見る

今回の「18,00」は、そのままカンマを消すと1,800になります。それが正解なら便利ですが、入力担当者が18,000を書き損ねた可能性もあります。コードはその判断をできないので、保留の状態を残します。要確認に回せたことが、今回の検査の成果です。すべてを数値にできたほうが優れているわけではありません。

「未精算」は、金額がまだ確定していないという教材上の状態です。ゼロ円として扱うと、小計と確定額が混同されます。人が精算書を確認して値を決めるまでは、元値と要確認の印を残します。ゼロ円のオンライン枠は既に確定した有効な値なので、未精算とは違って採用しています。

負号も確認対象です。調整額を「-300円」とした理由は、マイナスの表記を消さずに保つ練習をするためです。業務の列が支出のみで負数を認めない場合は、書式が正しくても別の理由で保留してください。技術的に整数へ変換できることと、入力ルールに合っていることは異なります。

コードを自分で変えるなら、まず「18,00」を「18,000」へ直してみます。この変更では採用が6件、要確認が1件、未入力が1件となり、採用行の小計は25,500円です。固定サンプルの assert は元の期待値なので、変更後の期待値も自分で直す必要があります。実務データが毎回7,500円になると検査するためのコードではありません。

次に全行を未入力へ変えた場面を考えます。値が一つもないのにゼロ円と表示されると、「費用がかからない」と誤読しやすくなります。今回の小計は min_count=1 を指定し、採用値がない場合の合計を欠損として残します。合計の欠損処理については、pandas公式のsum仕様も確認できます。

変換後の金額を検証し、独学の課題と相談内容を作る

coerceで欠損へ変えた行を、元からの欠損と分ける

errors="coerce" は、解釈できない値を欠損へ変える指定です。探索の段階で、どの値が変換できないかを調べたいときに役立ちます。一方で、「エラーが出なくなった」という理由だけで処理を完了すると、変換できなかった行が集計から抜けていることを見落とします。

今回のコードは書式検査を先に置き、採用候補の変換には raise を使いました。別の方法としてcoerceを使う場合も、原文を残し、元値が存在したのに変換後が欠損になった行を確認してください。元からの欠損と変換に失敗した行では、入力担当者へ聞く内容や直す場所が異なります。

「要確認」と「未入力」を別々に数えると、改善する作業が見えます。書式ミスが多いなら入力フォームの説明を見直す候補になります。未入力が多いなら、いつ金額が確定する表なのかを確かめます。ただし件数だけから担当者の能力やデータ全体の品質を評価するのではなく、業務の段階も合わせて読む必要があります。

欠損を0で埋める前には、「値がない」と「ゼロという値がある」の違いを確認します。未入力をゼロとして扱うと、費用の平均や予算の残額も変わる可能性があります。実際のゼロを採用し、確定していない金額は保留するという判断を、集計の前に決めておきましょう。

欠損以外にも重複が関わると、変換だけでは結果を確定できません。同じ精算が二回入っていれば、各行の数値は正しくても合計は増えます。その問題はCSVの欠損・重複を確認する練習で扱っています。今回の金額書式の検査と組み合わせるときも、どの工程で何を確かめるかを分けて記録します。

合計だけでなく、採用件数と保留理由を添えて伝える

「合計7,500円」とだけ報告すると、8件すべての金額が確認できたように見えるかもしれません。今回の表では3件の金額を採用していないため、「採用できた5件の小計7,500円、要確認2件、未入力1件」と伝えるほうが状況を説明できます。文章に対象範囲を添えるだけで、数値の意味が変わります。

原文と単位を保存↓ 全角・前後空白を整える書式が合う?合う → 数値化・採用件数・小計を照合合わない → 原文と理由を保留一覧へ
変換前の判定と、変換後の照合を分けます。保留した行は合計に含まれません。

件数の足し算も確かめます。全行8件に対して、採用5件、要確認2件、未入力1件で一致します。行を途中で削除してしまうと、この照合ができなくなります。今回のコードは元の行を残し、状態を付ける設計にしています。対象外を削除する運用では、削除前の件数と理由を別途残す方法が必要です。

最小値と最大値にも目を通します。税込の円列なのに小数が入る、桁が何桁も増える、符号が逆になるといった異常は、型が数値になっただけでは見つかりません。ただし、外れた値を自動的に誤りと決めるのは避けます。原票へ戻り、例外として正しい値なのかを確認する工程へつなげます。

集計の単位も確かめます。一人あたりの金額を合計して総額と呼んだり、月ごとの金額と年額を混ぜたりすると、各行の変換が正しくても報告は誤ります。合計前の列には「円」「対象期間」「単価か総額か」といった意味を付けておきます。数値変換は、説明可能な集計を作るための一工程です。

カテゴリ別にまとめる場合は、金額列だけでなくカテゴリの欠損にも注意します。採用できた金額があっても、分類の欠損によって結果から落ちる場合があります。groupbyで欠損キーと合計を確認する方法へ進むときは、今回の採用小計を比較用の基準として持っていきます。

小数、割合、万円、長い番号は別の変換課題として扱う

整数円の規則を、別の単位へそのまま広げないでください。「12%」は割合、「1.2万円」は万単位、「12.50ドル」は外国通貨です。記号を消して12、1.2、12.50という数値へしたとしても、同じ列で合計できるとは限りません。変換規則は数値の意味とセットで決めます。

小数の金額を扱う業務では、丸め方と必要な精度も課題になります。今回の整数型の例は、請求計算や税計算の実装を代替するものではありません。税率、端数処理、通貨の換算を追加する段階では、それぞれの原則と入力条件を確認し、今回の学習用サンプルから仕様を広げて設計します。

非常に大きな数値にも注意が必要です。pandasの公式APIは、大きな整数の変換で精度が失われる場合を説明しています。今回のコードで桁数を9桁までにしたのは、架空データの練習範囲を抑えるためです。実務のすべての金額に9桁の上限を設けるべき、という意味ではありません。

長い会員番号や取引番号は、計算しないなら文字列のまま扱う候補になります。「数値に見える」という理由で変換すると、先頭ゼロや表示が変わり、元の番号を復元できないことがあります。入力の文字列を守る場面と、演算用の数値を作る場面を分けてください。

日付の変換に失敗したときも、金額用の関数は使いません。型が合わない原因を特定するところは共通ですが、日付には書式や期間など別の条件があります。to_datetimeでNaTになった元値を検証する練習と比較すると、「何を変換するか」によって確認条件が違うことを学べます。

独学で進める人と、個別指導を比較する人の判断を分ける

この8行の表で、なぜ2行を保留したか説明できるなら、まず独学で条件を一つずつ変えてみましょう。許す表記を追加し、期待結果を自分で作り、採用される行が増えた理由を確認する練習です。関数を多く覚えるより、一つの変換仕様を説明できることを優先します。

つまずいた箇所が正規表現なら、小さな文字列だけで一致を試します。Seriesの扱いなら、表から一列を取り出して練習します。型や欠損の違いなら、採用された値と保留された値を並べます。問題を小さくすると、公式資料で調べる内容も、講師へ質問する内容も具体的になります。

Python Winnerは、公式ページでPythonの基礎・応用とマンツーマン指導を案内している比較候補です。検討しやすいのは、Pythonの基礎を含めて指導を受けたい人。別の教材も比較したいのは、この変換処理だけを学びたい人や、自分で検証を進められる人です。 今回のコードそのものが授業で扱われるとは確認していません。

金額変換で止まったときの学び方
選択肢選びやすい状況先に確かめること
公式資料と小さな独学課題期待結果を自分で作れる検証と調査の時間を確保できるか
pandasの単科教材Seriesや正規表現に学習範囲を絞りたい教材の版と入力例が自分の課題に合うか
Pythonの個別指導基礎理解や質問の整理で繰り返し止まる課題への質問範囲、回数、受講期間と総額

申込前には、希望するコースでpandasの前処理をどこまで扱うか、持ち込みの架空課題へ質問できるか、レッスン以外の質問方法、受講期限、税込総額を確認します。公式ページの給付金適用後の例を、そのまま自分の支払額と考えないでください。無料相談と有料受講の契約は別の判断です。

広告:Pythonの学習範囲と個別指導の条件を確認する → 【PythonWinner】

講座についてはPython Winnerの検討前の確認点も参照できます。学ぶ目的を「数値変換を使えるようになりたい」だけでなく、「誤った入力を保留し、件数と小計を説明できるようになりたい」と伝えると、必要な支援の範囲を確認しやすくなります。

FAQと、次の練習で残したい確認記録

実務に近づける前に、空白だけの値と、文字のある保留値を追加してみます。空白だけなら整形後は空文字となり、今回の仕様では未入力です。「金額未定」なら文字があるので要確認です。どちらも数値列では欠損ですが、入力の状態は違います。出力の見た目が同じだからといって、確認する作業まで同じにしないようにします。

次は「1,800円円」を追加します。末尾の円を一つだけ外した後も円が残るため、書式に一致せず要確認になります。もし円をすべて消すように変更すれば、重複した単位の入力も採用されます。どちらが業務に合うかは入力規則によりますが、今回の教材では誤った表記を見つけることを優先しています。変更前に、どの不備を見つけたいのかを説明してください。

9桁を超える値の練習では、採用されないことだけでなく、なぜ保留したのかも記録します。今回の状態列は簡潔に「要確認」としていますが、処理を運用へ近づけるなら、「書式が違う」「練習の桁数上限を超える」「金額が未確定」といった理由を別の列へ残す方法があります。状態を細かくする際は、理由ごとの件数を足すと全体へ戻るかも確認しましょう。

確認用の一覧を人へ渡すときは、金額の列だけでなく費目と原文も表示します。自分がPythonを使えるとしても、確認する人がコードを読むとは限りません。どの行を直せばよいのかが分かる出力を作ることも、前処理の課題です。社内で使う一覧なら、共有先や保管場所のルールに合わせ、学習用のファイルと本番のデータを区別します。

入力が確定した後の再実行も考えます。保留していた交通費が900円と判明したら、原票を確認して入力を更新し、同じ検査を通します。最初の結果表へ数値だけを手で足すと、コードで作った記録と報告額が離れる可能性があります。元の入力の変更理由を残し、処理と照合を一巡させる形なら、今回学んだ確認方法を継続できます。

練習を終えたら、元の8行、入力のルール、採用5件の値、要確認2件の理由、未入力1件、小計7,500円を一つの記録へ残します。コードだけを保存するより、どういう入力を許し、何を保留したかを後から確かめやすくなります。自分で追加した表記があるなら、その理由と期待結果も書き添えます。

次の課題は、書式を一種類追加する程度にします。例えば前後の空白を増やす、ゼロを円付きにする、誤ったカンマをもう一つ混ぜる、といった変更です。最初からすべての通貨や小数へ対応すると、何を確認すればよいかが曖昧になります。入力と期待結果を一緒に変える練習で、処理の意味を身につけましょう。

よくある質問

Q. カンマを削除してto_numericへ渡すだけでよいですか?
A.

入力の桁区切りが正しいと確認できている場合には方法の一つです。ただし18,00なども1800へ変わるため、この記事では削除前に書式を確認し、不正な区切りを保留します。

Q. 円や全角数字はto_numericだけで変換できますか?
A.

今回の円付き・全角の入力は、文字を整え、書式を確認してから数値化します。全角を正規化しても、単位や金額の正しさが確定するわけではありません。

Q. errors='coerce'でエラーが消えたら完成ですか?
A.

完成とは限りません。変換できなかった値が欠損になって集計から抜ける可能性があります。原文、元からの欠損、変換失敗、採用件数を確認してください。

Q. 空欄や未精算を0にしてもよいですか?
A.

ゼロという意味を確認できた場合に限って検討します。値が未確定なのか、取得できなかったのか、実際にゼロなのかを分け、根拠なく埋めないようにします。

Q. この記事のコードは万円や小数にも対応しますか?
A.

対応していません。整数の円、任意の負号、正しい3桁区切りに限定した教材です。万円、小数、割合、外国通貨は、単位と精度の規則を別に設計してください。