お掃除 7桁データを瞬時にクリーニングする3つの秘策

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');

パーティションごとにクリーニングを実行すれば、メモリ使用量が抑えられ、処理速度も向上します。


まとめ

  1. データ型の整合性を最初に確保

    • 文字列型で統一 → 先頭0の保護
    • 欠損値を一括正規化 → 後工程でのエラー防止
  2. pandas のベクトル化正規表現で高速化

    • 余計な文字を一括除去
    • 7桁制限を自動チェック
  3. 大規模データは 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つの秘策を試し、効率的で信頼できるデータ基盤を構築してみてください。

掃除
セキレイ・ミナミ

こんにちは。
「セキレイ日和」を運営している セキレイ・ミナミ です。

街中で見かけるセキレイのように、
日々のリズムを整えながら、静かに、軽やかに暮らすことを大切にしています。

ものを必要以上に持たず、
心が落ち着く選択を積み重ねていくことで、
暮らしは、静かに豊かさを増していく——
そんな実感を日々の中で育てています。

このサイトでは、「落ち着き」と「自然のリズム」を軸に、
シンプルに整えていくための工夫や、
私自身の気づきをゆるやかに記録しています。

もしどこかに、あなたの暮らしにそっと寄り添うヒントがあれば嬉しく思います。

どうぞよろしくお願いします。

セキレイ・ミナミをフォローする

コメント