2.3.4
read_csvで空白や桁ズレが原因で数値変換できない
まとめ
pd.read_csv()で空白や桁区切りカンマが原因のValueErrorを解決する。skipinitialspaceやstr.replace()・convertersで不要な空白や記号を除去する。- 数値列に全角スペース・桁区切りカンマ・タブが混入して変換できないときに参照する。
pandas.read_csv() で読み込んだ列を数値に変換しようとすると
ValueError: could not convert string to float: ' 1,234 '
や
ValueError: invalid literal for int() with base 10: '001 234'
といったエラーで処理が止まることがあります。これは 列の中に余計な空白・全角スペース・桁ズレが含まれている ためです。
解決法 1: 読み込み時に空白を自動でトリムする #
| |
skipinitialspace=True を指定すると、区切り文字の直後にある半角スペースを自動で削除してくれます。
ただし全角スペースやタブには効かないため、別途 .str.strip() を併用します。
解決法 2: 文字列を明示的にクレンジングしてから数値化する #
| |
dtype=str で文字列として読み込み、不要な空白やカンマを正規表現で除去してから数値化すると安全です。
桁ズレやタブが混ざる帳票でも柔軟に処理できます。
解決法 3: 固定長レイアウトなら read_fwf を使う #
帳票によっては CSV ではなく 固定長 (Fixed Width) のテキストが渡されることがあります。
この場合は read_fwf に切り替えると列境界を位置で指定できます。
| |
解決法 4: 列単位でクリーニング関数を適用する #
| |
converters に関数を渡すと、読み込み段階で値を整形できます。
全角スペース (\u3000) や制御文字を取り除いてしまいましょう。
チェックリスト #
- 半角スペースだけでなく 全角スペース やタブが混じっていないか
- 見た目の桁区切りとして カンマ が含まれていないか
- 固定長形式なら
read_fwfを検討したか - 変換できない値があったとき
errors='coerce'を使うか検討したか
| |