7桁データを瞬時にクリーニングする3つの秘策
現代のデータ分析では、大量の数値データを扱う際に「7桁データ」という言葉を耳にすることが増えています。これは、長い数値列(例:1234567)を含むデータセットで、文字列として認識されないと統計や機械学習に大きく影響します。
しかし、データが不揃いだったり空白が含まれていたりすると、分析が行える状態とは言えません。そこで、この記事では「7桁データを瞬時にクリーニングするための3つの秘策」を紹介します。
【前提】
- 目的はスピードと確実さ。
- データはCSV・Excel・Databasesに限らず、どこに置かれていても手が届く方法を紹介。
- 主要言語はPython(pandas, re)とSQL。
1. まずは「文字列として扱える」ことを確認しよう
1‑1. データ型の確認
7桁数値が数値型(int, float)になってしまうと、先頭の0が消えてしまいます。
pandasで確認するには dtype をチェック。
import pandas as pd
df = pd.read_csv('data.csv')
print(df['col_name'].dtype) # object (文字列) であれば OK
数値型であった場合は astype(str) で文字列に変換します。
df['col_name'] = df['col_name'].astype(str)
1‑2. 欠損値を一括で除去・置換
欠損値は NaN だけでなく、空文字列、'NULL'、'-' などが混在していることが多いです。
一括で処理することで後続の正規表現や変換が楽になります。
# ① 空文字('')や'-'をNaNに変換
df['col_name'] = df['col_name'].replace({'', '-'}, pd.NA)
# ② NaN を欠損とみなすか特定値に置換
df['col_name'] = df['col_name'].fillna('NA') # 例
2. 速くて汎用的——ベクトル化正規表現で正規化
Python の正規表現は行単位で実行すると遅いですが、pandas なら str.replace がCベースで高速です。
2‑1. 余計な文字を一括削除
7桁数値といえば「ハイフン」や「カンマ」が紛れ込むケースが多いです。
df['col_name'] = (
df['col_name']
.str.replace(r'[-,]', '', regex=True) # -や,を除去
.str.strip() # 前後の空白除去
)
2‑2. 数値範囲外のデータを自動でフィルタ
7桁数値が 1000000〜9999999 であることを前提に、範囲外を NaN に変換。
df['col_name'] = df['col_name'].apply(
lambda x: x if x.isdigit() and 1000000 <= int(x) <= 9999999 else pd.NA
)
これで、1000000 未満 や 10000000 超 のデータは除外されます。
2‑3. スマートパック―同時に複数列を処理
複数列に共通のクリーニングロジックがある場合は apply の代わりに DataFrame.filter と組み合わせるとさらに高速です。
cols = ['id', 'code', 'ref']
df[cols] = df[cols].replace(r'[^0-9]', '', regex=True) # すべての列から数字以外を削除
3. データベースで一括加工 — スケーラビリティを発揮
巨大なスプレッドシートやCSVでは Python で全部読み込むとメモリが逼迫します。この場合は ETL(Extract-Transform-Load) パイプラインを使い、SQL の力で大量データを一括処理するのがベストです。
3‑1. 変換テーブルを作成
数値列の正規化を行う 変換テーブル を用意し、クエリに組み込みます。
CREATE TABLE clean_data AS
SELECT
CAST(
REGEXP_REPLACE(col_name, '[-,]', '') AS bigint
) AS clean_col
FROM raw_data
WHERE col_name IS NOT NULL
AND REGEXP_MATCH(col_name, '^\d{7}$'); -- 7桁の数値のみ抽出
3‑2. ビルド済みストアドプロシージャを利用
頻繁にクリーニングする場合はプロシージャ化しておくと便利です。
CREATE OR REPLACE FUNCTION clean_7digits()
RETURNS void AS $$
BEGIN
DELETE FROM raw_data WHERE NOT REGEXP_MATCH(col_name, '^\d{7}$');
UPDATE raw_data
SET col_name = REGEXP_REPLACE(col_name, '[-,]', '');
/* さらに必要に応じて追加処理 */
END;
$$ LANGUAGE plpgsql;
後から SELECT * FROM clean_7digits(); で呼び出せます。
3‑3. パーティション分割でさらに高速化
巨大テーブルの場合は パーティション で分割すると、WHERE 節が極めて効率化されます。
CREATE TABLE raw_data_y2024 PARTITION OF raw_data
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
パーティションごとにクリーニングを実行すれば、メモリ使用量が抑えられ、処理速度も向上します。
まとめ
-
データ型の整合性を最初に確保
- 文字列型で統一 → 先頭0の保護
- 欠損値を一括正規化 → 後工程でのエラー防止
-
pandas のベクトル化正規表現で高速化
- 余計な文字を一括除去
- 7桁制限を自動チェック
-
大規模データは SQL で一括処理
- 変換テーブル / ストアドプロシージャ / パーティション利用
- ETL パイプラインを構築し、再利用性を確保
これらを組み合わせることで、数万行、数百万行の7桁データも数秒でクリーニングが可能になります。
先ほどまで時間がかかっていたデータ前処理を、スムーズに実行し、分析本番へスピードで移行できます。
よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
| 欠損値を完全に除外したい | dropna(subset=['col_name']) で特定列の欠損を除外。 |
| 数値以外が混入しているがパターンが多い | str.replace(r'[^0-9]', '', regex=True) で数字以外を全除去。 |
| Python がメモリ不足になる | データベース側で前処理を行い、クリーンデータのみを pandas へ渡す。 |
| 複数列に同じ処理を適用したい | df[cols] = df[cols].replace(...) で一括実行可能。 |
| 自動化したい | Airflow などのワークフローツールで ETL スクリプトを定期実行。 |
さらに学びたい方へ
- pandas 官方ドキュメント —
Series.strシリーズ操作 - SQL 正規表現 — DBMS ごとにサポート内容が異なるので調べる
- ETL ツール — Apache NiFi, Talend, dbt など
データクリーニングは「データの質を担保する最大の投資」です。
今回紹介した3つの秘策を試し、効率的で信頼できるデータ基盤を構築してみてください。

コメント