「見た目は同じなのに、なぜか重複チェックや集計で別データ扱いになる。」
そんなことはありませんか?
商品マスターや顧客リストをまとめていると、
a001とA001A003とA003株式会社ABCと株式会社ABC東京と東京
のように、見た目はほとんど同じでも、実際には文字の種類や余分なスペースが違うデータが混ざることがあります。
この状態のままでは、
- 重複チェックで同じ商品なのに別データとして扱われる
- 店舗別・地域別の集計が分かれる
- 商品コードで照合しても一致しない
- CSVを結合したあとに表記ゆれが増える
といった問題が起きます。
この記事では、Google ColabとPythonを使って、CSV内の表記ゆれや余分な空白をまとめて整える方法を紹介します。
今回は実際に、
- 文字列の前後にある余分な空白を削除
- 商品コードの小文字・大文字を統一
- 全角英数字を半角へ統一
- 会社名・地域もまとめて整形
- 整形後のCSVを保存
まで動作確認しました。
PythonをPCへインストールする必要はありません。
「同じはずのデータが、微妙な表記の違いで別物として扱われる」問題を減らしたい人向けの記事です。
✅ この記事は実際に動作検証しています
表記ゆれを含むCSVをGoogle Colabで処理し、前後の余分な空白、全角・半角、大文字・小文字などを統一しました。整形後のデータを新しいCSVとして保存しています。
検証結果: 前後空白削除:確認済み / NFKC正規化:確認済み / 大文字化:確認済み / cleaned_data.csvを出力
この記事はこんな人向け
- 商品コードの大文字・小文字が混ざっている
- CSVを結合したら全角・半角がバラバラになった
- 顧客名や会社名の前後に余分なスペースが入っている
- 重複チェックをしても同じデータがうまくまとまらない
- 店舗名・地域名の表記を揃えたい
- CSVを受け取るたびにExcelで手作業で文字を直している
この記事でできるようになること
今回の方法では、例えば次のようなデータを、
a001
A002
A003
A004
a005
次のように揃えます。
A001
A002
A003
A004
A005
また、
" 株式会社ABC "
" 大阪"
"福岡 "
のような前後の空白も削除します。
最終的には、
表記ゆれのあるCSV
↓
余分な空白を削除
↓
全角英数字を半角へ統一
↓
大文字・小文字を統一
↓
cleaned_data.csvとして保存
という流れです。
今回使うデータ
今回は、次のようなデータを使います。
| 商品コード | 会社名 | 地域 |
|---|---|---|
| a001 | 株式会社ABC | 東京 |
| A002 | 株式会社DEF | 大阪 |
| A003 | 株式会社GHI | 福岡 |
| A004 | 株式会社JKL | 名古屋 |
| a005 | 株式会社MNO | 札幌 |
見た目だけでは分かりにくいですが、
- 商品コードに小文字が混ざっている
- 商品コードに全角英数字が混ざっている
- 会社名や地域の前後に余分なスペースがある
状態です。
今回はこのファイルを、
text_cleanup_test.csv
として使用します。

Google ColabでCSVを読み込む
Google Colabで新しいノートブックを作成します。
今回は、
TaskLess Lab_CSV表記ゆれ整形テスト
という名前にしました。
CSVをアップロードしたら、次のコードを実行します。
import pandas as pd
import unicodedata
df = pd.read_csv("text_cleanup_test.csv")
display(df)
まずは元データを表示して、表記ゆれが残っていることを確認します。
まず前後の余分な空白を削除する
文字列の前後に入っている余分な空白は、str.strip() を使って削除できます。
例えば商品コードなら、
df["商品コード"] = df["商品コード"].str.strip()
です。
会社名なら、
df["会社名"] = df["会社名"].str.strip()
地域なら、
df["地域"] = df["地域"].str.strip()
と書きます。
今回の検証では、str.strip() で前後の半角スペースだけでなく、全角スペースも取り除けました。
例えば、
" 株式会社ABC "
は、
株式会社ABC
に、
" 大阪"
は、
大阪
に整えられます。
商品コードの大文字・小文字を統一する
商品コードでは、
a001
A001
のように大文字・小文字が混ざることがあります。
この場合は、str.upper() を使って大文字に統一できます。
df["商品コード"] = (
df["商品コード"]
.str.strip()
.str.upper()
)
これで、
a001
は、
A001
になります。
逆に小文字へ統一したい場合は、
.str.lower()
を使えます。
全角英数字を半角へ統一する
次に、
A003
のような全角英数字を、
A003
へ揃えます。
今回はPython標準の unicodedata を使います。
import unicodedata
そして、商品コードに次の処理を加えます。
df["商品コード"] = (
df["商品コード"]
.str.strip()
.apply(lambda x: unicodedata.normalize("NFKC", x))
.str.upper()
)
この中の、
unicodedata.normalize("NFKC", x)
が、全角英数字などを統一する処理です。
今回のテストでは、
A003
が、
A003
に、
a005
が、
A005
に揃いました。

会社名・地域もまとめて整形する
商品コードだけでなく、会社名・地域もまとめて整えます。
今回最終的に使ったコードは次のとおりです。
import unicodedata
df["商品コード"] = (
df["商品コード"]
.str.strip()
.apply(lambda x: unicodedata.normalize("NFKC", x))
.str.upper()
)
df["会社名"] = (
df["会社名"]
.str.strip()
.apply(lambda x: unicodedata.normalize("NFKC", x))
)
df["地域"] = (
df["地域"]
.str.strip()
.apply(lambda x: unicodedata.normalize("NFKC", x))
)
display(df)
この処理で、
- 商品コードの前後空白削除
- 商品コードの全角英数字を半角へ統一
- 商品コードを大文字へ統一
- 会社名の前後空白削除
- 地域の前後空白削除
- 文字種の統一
をまとめて行います。

整形後は、
A001 株式会社ABC 東京
A002 株式会社DEF 大阪
A003 株式会社GHI 福岡
A004 株式会社JKL 名古屋
A005 株式会社MNO 札幌
のように、表記が揃いました。
strip() と normalize() の役割は違う
今回使った2つの処理には、それぞれ役割があります。
str.strip()
文字列の前後にある余分な空白を削除します。
例えば、
" 東京 "
を、
東京
にします。
unicodedata.normalize("NFKC", x)
全角・半角などの文字種をある程度揃えます。
例えば、
A003
を、
A003
へ変換します。
つまり、
余分な空白 → strip()
全角・半角 → normalize()
大文字・小文字 → upper()
と覚えると分かりやすいです。
なぜ表記ゆれを先に整えるのか
表記ゆれが残っていると、後工程で問題が起きやすくなります。
例えば、
A001
a001
A001
は、人が見れば同じ商品コードだと分かります。
しかしそのまま比較すると、文字列としては別の値として扱われる可能性があります。
その結果、
- 重複チェックで検出できない
- 商品コード同士の照合に失敗する
- 集計結果が分かれる
- CSV結合後に同じ商品が複数行できる
といった問題につながります。
そのため、データを比較・集計する前に、表記を揃えておくと扱いやすくなります。
表記を揃えたあとは、同じ商品コードや顧客IDが複数登録されていないか確認しておくと、データをさらに整理できます。
整形後のCSVを保存する
最後に、表記を整えたデータを新しいCSVとして保存します。
df.to_csv(
"cleaned_data.csv",
index=False,
encoding="utf-8-sig"
)
print("cleaned_data.csv を作成しました")
実行すると、Google Colabの左側ファイル一覧に、
cleaned_data.csv
が表示されます。

これをダウンロードすれば、Excelで開いたり、ほかの処理に使ったりできます。
元CSVを上書きせず、別ファイルで保存する理由
今回は、
text_cleanup_test.csv
をそのまま上書きせず、
cleaned_data.csv
として保存しています。
これは、整形前の元データを残しておくためです。
もし変換結果に問題があった場合でも、元データが残っていればやり直せます。
実務でも、最初は元CSVを上書きせず、
元データ
↓
整形
↓
別ファイルとして保存
にしておく方が安全です。
自分のCSVで変更する場所
今回のコードを自分のファイルで使う場合、主に変更するのは次の部分です。
| 今回の設定 | 自分のCSVでは |
|---|---|
text_cleanup_test.csv | 実際のCSVファイル名 |
"商品コード" | 整形したい列名 |
"会社名" | 整形したい列名 |
"地域" | 整形したい列名 |
cleaned_data.csv | 保存するファイル名 |
例えば顧客IDなら、
df["顧客ID"] = (
df["顧客ID"]
.str.strip()
.apply(lambda x: unicodedata.normalize("NFKC", x))
.str.upper()
)
のように変更できます。
すべての文字列列を一括で整えることもできる
列数が少なければ、今回のように列ごとに指定した方が分かりやすいです。
一方で、文字列の列が多い場合は、すべての文字列列をまとめて処理する方法もあります。
ただし、
- 商品コードは大文字にしたい
- 会社名は大文字にしたくない
- 一部の列はそのまま残したい
といった違いがあることも多いため、最初は列ごとに処理を決める方が安全です。
この方法で直せない表記ゆれもある
今回扱ったのは、機械的に統一しやすい表記ゆれです。
例えば、
- 前後の空白
- 全角・半角
- 大文字・小文字
です。
一方、
株式会社ABC
(株)ABC
ABC株式会社
や、
東京都
東京
のような違いは、単純な strip() や normalize() だけでは同じ表記にはなりません。
これらを揃える場合は、
- 置換ルールを作る
- 対応表を作る
- 名寄せ処理をする
など、もう一段別の処理が必要です。
この記事ではまず、機械的に安全に揃えやすい表記ゆれを対象にしています。
どんな仕事で使える?
今回の方法は、商品マスター以外にも使えます。
- 顧客IDの大文字・小文字統一
- JANコードやSKUの全角・半角統一
- 店舗名の前後スペース削除
- 会社名の余分な空白削除
- CSV結合前のデータ整形
- 重複チェック前の前処理
- システムへ取り込むCSVの形式統一
特に、
複数の人・複数のシステムから集めたCSVを1つにまとめる
仕事では、表記ゆれが入りやすいので使いやすい処理です。
前回の欠損チェックとの違い
前回の記事では、
セルに何も入っていない
欠損データをチェックしました。
今回は、
値は入っているが、表記が揃っていない
データを整えています。
例えば、
NaN
なら欠損チェック。
a001
A001
A001
なら今回の表記ゆれチェックです。
この2つを組み合わせると、
空白がないか確認
↓
表記を揃える
↓
重複チェック
↓
比較・集計
というデータ整理の流れを作れます。
値そのものが入っていないセルを確認したい場合は、欠損チェックを使います。

表記を揃えた2つのCSVについて、価格や在庫などの変更点を確認したい場合は新旧比較が使えます。

まとめ
今回は、Google ColabとPythonを使ってCSVの表記ゆれを整えました。
実際に確認したのは、
- 前後の余分な空白を削除
- 商品コードを大文字に統一
- 全角英数字を半角へ統一
- 会社名・地域もまとめて整形
- 整形後のデータをCSV保存
です。
特に、
a001
A001
A001
のような違いは、人が見れば同じでも、データ処理では別の値として扱われる原因になります。
重複チェックや集計をする前に表記を揃えておくだけで、その後のデータ処理がかなり安定します。
毎回Excelでスペースを消したり、大文字・小文字を直したりしているなら、この方法で表記ゆれをまとめて整えて、面倒な修正作業を減らしていきましょう!


