PythonのPandasの正規表現を使ったデータ抽出について

Python,イメージ

AI実装検定のご案内

PythonのPandasにおける正規表現(regex)を使ったデータ抽出は、テキストデータを操作する際に非常に強力な手法です。

特に、データフレーム(DataFrame)やシリーズ(Series)内の文字列に対して、パターンに基づくフィルタリングや変換を行うことができます。

目次

正規表現を使う場面と基本構文

よくあるユースケース

  • 特定のパターンにマッチする行を抽出
  • 電話番号、メールアドレス、URLなどの検出
  • 数字やアルファベットの抽出
  • 前方一致/後方一致/部分一致のフィルタ
  • 特定文字の有無による分類やフラグ付け

正規表現の基本

パターン説明
.任意の1文字
^文字列の先頭
$文字列の末尾
*0回以上の繰り返し
+1回以上の繰り返し
?0回または1回の出現
[abc]a, b, c のいずれか
[^abc]a, b, c 以外
\d数字(0-9)
\w単語文字(英数字+アンダースコア)
\s空白文字(空白、改行、タブなど)

str.contains() で条件抽出

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'email': ['alice@example.com', 'bob@work.net', 'charlie@edu.org', 'david@example.com', 'eve@private.com']
})

# "example"を含むメールアドレスを抽出
filtered_df = df[df['email'].str.contains(r'example', regex=True)]

print(filtered_df)

オプション

  • case=False:大文字小文字を無視
  • na=False:NaNを無視してFalse扱い

str.extract() でパターンから抽出

df['domain'] = df['email'].str.extract(r'@(.+)$')
print(df[['email', 'domain']])
  • 括弧 () はキャプチャグループを意味し、抽出対象を指定します。
  • 複数の括弧がある場合は複数列で返ります。

str.replace() で文字列の置換

# ドメインがexample.comのメールだけをマスキング
df['email_masked'] = df['email'].str.replace(r'^.*@example\.com$', 'masked@example.com', regex=True)
print(df[['email', 'email_masked']])
  • 正規表現ベースでの文字列置換が可能。
  • regex=Falseにすれば単純な文字列置換。

str.match() との違い

  • match()先頭がマッチしていないと False
  • contains()文字列内にどこかマッチすれば True
# "Alice" で始まる name を判定(先頭一致)
df['is_alice'] = df['name'].str.match(r'^Alice')
print(df[['name', 'is_alice']])

応用例:電話番号の抽出と整形

# 電話番号のサンプル
data = pd.DataFrame({
    'contact': ['080-1234-5678', '03-9999-9999', 'abc', '05012345678', None]
})

# 「数字-数字-数字」の形式を抽出
data['phone_extracted'] = data['contact'].str.extract(r'(\d{2,4}-\d{2,4}-\d{4})')

# ハイフンなし電話番号(10桁または11桁の数字)を抽出
data['digits_only'] = data['contact'].str.extract(r'(\d{10,11})')

print(data)

応用例:メールアドレスのドメイン分類

# ドメイン部分(example, work など)を抽出
df['domain_type'] = df['email'].str.extract(r'@(\w+)\.')
print(df[['email', 'domain_type']])

正規表現を使ったフィルタ条件の組み合わせ(AND/OR)

# example.comで終わるかを判定
df['is_example_com'] = df['email'].str.contains(r'@example\.com$', regex=True)
print(df[['email', 'is_example_com']])
# "example" または "work" を含むメール
df['is_example_or_work'] = df['email'].str.contains(r'example|work', regex=True)
print(df[['email', 'is_example_or_work']])

pandasで正規表現を使う関数まとめ

関数名用途
str.contains()正規表現によるフィルタリング
str.extract()パターンの部分抽出
str.match()先頭とのマッチ確認
str.replace()正規表現を使った置換
str.findall()全てのマッチをリストで取得

まとめ:Pandasでの正規表現活用のポイント

  • 正規表現は、複雑なテキストパターンを自在に扱える
  • str.contains()str.extract() を中心に使うと便利
  • na=False を指定してNaN対策を忘れずに
  • 処理前に .astype(str) で型を文字列にしておくと安全
  • pandasと正規表現の組み合わせは、前処理、データクレンジング、特徴量生成に不可欠

以上、PythonのPandasの正規表現を使ったデータ抽出についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次