Pandasで正規表現(regex)を用いたデータ抽出は、テキストデータを扱う上で非常に強力です。
特にDataFrameの列に文字列データが格納されている場合、str
アクセサを通じて正規表現を使った検索・抽出・変換が可能です。
以下では、代表的な使い方を詳しく解説します。
目次
データ準備
まずはPandasをインポートし、データを準備します。
import pandas as pd
# サンプルデータ
df_names = pd.DataFrame({
"名前": ["山田太郎", "田中花子", "佐藤健", "鈴木一郎"]
})
df_emails = pd.DataFrame({
"メール": ["taro@example.com", "hanako@test.jp", "ken@sample.net"]
})
df_phones = pd.DataFrame({
"電話番号": ["090-1234-5678", "03-9876-5432", "080-1111-2222"]
})
df_names, df_emails, df_phones
str.contains
– 特定の文字列を含む行を抽出
部分一致やパターンマッチを確認するときに便利です。
# 「田」を含む名前を抽出
df_names[df_names["名前"].str.contains("田")]
regex=False
を指定すると正規表現ではなく単純な部分一致検索になります。- 大文字小文字を区別しない場合は
case=False
を使います。
str.match
– 文字列全体に正規表現が一致するか
行頭から行全体をマッチさせたい場合に使います。
# 「山」で始まる名前を抽出
df_names[df_names["名前"].str.match("^山")]
str.extract
– パターンに一致した部分を抽出
グループ化 ()
を使うと、特定の部分を新しい列として抽出できます。
# メールアドレスのドメイン部分を抽出
df_emails["ドメイン"] = df_emails["メール"].str.extract(r"@(.+)")
df_emails
str.replace
– 正規表現を使った置換
文字列のクリーニングや整形に利用できます。
# 電話番号から数字以外を削除
df_phones["電話番号_clean"] = df_phones["電話番号"].str.replace(r"\D", "", regex=True)
df_phones
応用例:複数条件で抽出
正規表現の OR (|
) や AND を駆使して複雑な条件を作れます。
# 「山」または「佐藤」を含む名前
df_names[df_names["名前"].str.contains("山|佐藤")]
よく使う正規表現パターン例
^文字列
: 行頭が特定の文字列文字列$
: 行末が特定の文字列.
: 任意の1文字\d
: 数字\D
: 数字以外\w
: 英数字またはアンダースコア\s
: 空白文字{n,m}
: n回以上m回以下の繰り返し
まとめ
- contains → 部分一致検索
- match → 全体一致(行頭からマッチ)
- extract → グループ化して一部を抽出
- replace → 正規表現を使った置換
これらを組み合わせることで、データの抽出・整形・前処理が強力に行えます。
以上、Pandasで正規表現を用いたデータ抽出についてでした。
最後までお読みいただき、ありがとうございました。