ここでは PythonのPandasで文字列を抽出する方法 について、できるだけ詳しく体系的に解説します。
特にSeries.strアクセサを用いた操作に焦点を当てます。
目次
基本:文字列操作はstr
アクセサを利用
Pandasでは、文字列カラムに対して .str
アクセサ を使うことで、Pythonのstr
やre
(正規表現)の機能をベクトル化して効率的に適用できます。
import pandas as pd
df = pd.DataFrame({
"name": ["Alice Smith", "Bob Johnson", "Charlie Brown"]
})
# 例: 文字列を小文字に変換
df["name"].str.lower()
部分文字列の抽出
インデックスで抽出(スライス)
# 先頭5文字を抽出
df["name"].str[:5]
固定文字列の抽出
# "Smith" を含むかどうか
df["name"].str.contains("Smith")
# "Smith" を "S." に置換
df["name"].str.replace("Smith", "S.")
正規表現による抽出
extract()
正規表現のキャプチャグループを使って抽出できます。
import pandas as pd
df = pd.DataFrame({
"name": ["Alice Smith", "Bob Johnson", "Charlie Brown"]
})
# 正規表現で抽出
df["first_name"] = df["name"].str.extract(r"^(\w+)")
df["last_name"] = df["name"].str.extract(r"(\w+)$")
# 出力(Colabでは最後にdfと書くだけでもOK)
print(df)
extractall()
繰り返しパターンをすべて抽出。
df = pd.DataFrame({"text": ["ab12cd34", "ef56"]})
df["text"].str.extractall(r"(\d+)")
よく使う文字列操作
メソッド | 説明 | 例 |
---|---|---|
.str.contains("x") | パターンを含むか | df["col"].str.contains(r"\d+") |
.str.startswith("x") | 先頭一致 | df["col"].str.startswith("A") |
.str.endswith("x") | 末尾一致 | df["col"].str.endswith("son") |
.str.extract(r"(正規表現)") | 抽出 | df["col"].str.extract(r"(\d+)") |
.str.split("区切り") | 分割 | df["col"].str.split(" ") |
.str.get(i) | 分割後の要素を取得 | df["col"].str.split(" ").str.get(0) |
.str.findall(r"正規表現") | マッチすべてをリストで取得 | df["col"].str.findall(r"\d+") |
応用例
メールアドレスからユーザー名とドメインを抽出
df_email = pd.DataFrame({
"email": ["alice@example.com", "bob@test.org", "charlie@work.net"]
})
df_email["user"] = df_email["email"].str.extract(r"([^@]+)")
df_email["domain"] = df_email["email"].str.extract(r"@(.+)")
print("\nメールアドレスからユーザー名とドメインを抽出")
print(df_email)
URLからドメインを抽出
df_url = pd.DataFrame({
"url": ["https://example.com/page1", "http://test.org/home"]
})
df_url["domain"] = df_url["url"].str.extract(r"https?://([^/]+)")
print("\nURLからドメインを抽出")
print(df_url)
数字だけを抽出
df_num = pd.DataFrame({"text": ["item123", "order456", "test789"]})
df_num["number"] = df_num["text"].str.extract(r"(\d+)")
print("\n数字だけを抽出")
print(df_num)
まとめ
- 固定長ならスライス(
.str[:5]
) - 単一パターンなら
extract
- 複数パターンなら
extractall
- 条件分岐には
contains
,startswith
,endswith
- すべてのマッチを取得したいなら
findall
Pandasの文字列操作は正規表現と組み合わせることで非常に強力になります。
以上、PythonのPandasの文字列の抽出についてでした。
最後までお読みいただき、ありがとうございました。