Pandas 文字列操作
Pandas は強力な文字列処理機能を提供しており、.strアクセサは、Python の文字列を操作するように Series の各要素を処理できます。
str アクセサの概要
Series のデータ型がobjectの場合、アクセサを使用して.str文字列操作を行うことができます。
例
import pandas as pd
# 文字列を含む Series を作成
s = pd.Series(["hello", "world", "pandas", "Python"])
print("元の Series:")
print(s)
print()
# 小文字に変換
print("小文字に変換:")
print(s.str.lower())
print()
# 大文字に変換
print("大文字に変換:")
print(s.str.upper())
print()
# 先頭文字を大文字にする
print("先頭文字を大文字にする:")
print(s.str.capitalize())
# 文字列を含む Series を作成
s = pd.Series(["hello", "world", "pandas", "Python"])
print("元の Series:")
print(s)
print()
# 小文字に変換
print("小文字に変換:")
print(s.str.lower())
print()
# 大文字に変換
print("大文字に変換:")
print(s.str.upper())
print()
# 先頭文字を大文字にする
print("先頭文字を大文字にする:")
print(s.str.capitalize())
よく使う文字列関数
大文字・小文字の変換
| メソッド | 説明 | 例 |
|---|---|---|
str.lower() |
小文字に変換 | "Hello" → "hello" |
str.upper() |
大文字に変換 | "Hello" → "HELLO" |
str.title() |
先頭文字を大文字にする | "hello world" → "Hello World" |
str.capitalize() |
先頭文字を大文字にし、残りは小文字にする | "hELLO" → "Hello" |
str.swapcase() |
大文字と小文字を入れ替える | "HeLLo" → "hEllO" |
文字列の検索と置換
例
import pandas as pd
s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])
print("元のデータ:")
print(s)
print()
# 含むかどうかの判定
print("'python' を含む:")
print(s.str.contains("python", case=False))
print()
# 先頭/末尾の判定
print("'hello' で始まる:")
print(s.str.startswith("hello"))
print()
# 置換
print("スペースをアンダースコアに置換:")
print(s.str.replace(" ", "_"))
print()
# 分割
print("スペースで分割:")
print(s.str.split(" "))
s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])
print("元のデータ:")
print(s)
print()
# 含むかどうかの判定
print("'python' を含む:")
print(s.str.contains("python", case=False))
print()
# 先頭/末尾の判定
print("'hello' で始まる:")
print(s.str.startswith("hello"))
print()
# 置換
print("スペースをアンダースコアに置換:")
print(s.str.replace(" ", "_"))
print()
# 分割
print("スペースで分割:")
print(s.str.split(" "))
スペース除去と埋め込み
例
import pandas as pd
s = pd.Series([" hello ", "world ", " pandas", " python "])
print("元のデータ:")
print(s)
print()
# 先頭と末尾のスペースを除去
print("先頭と末尾のスペースを除去:")
print(s.str.strip())
print()
# 左側のスペースを除去
print("左側のスペースを除去:")
print(s.str.lstrip())
print()
# 右側のスペースを除去
print("右側のスペースを除去:")
print(s.str.rstrip())
print()
# 埋め込み
print("左側に0を埋めて長さ10にする:")
print(s.str.pad(10, side="left", fillchar="0"))
s = pd.Series([" hello ", "world ", " pandas", " python "])
print("元のデータ:")
print(s)
print()
# 先頭と末尾のスペースを除去
print("先頭と末尾のスペースを除去:")
print(s.str.strip())
print()
# 左側のスペースを除去
print("左側のスペースを除去:")
print(s.str.lstrip())
print()
# 右側のスペースを除去
print("右側のスペースを除去:")
print(s.str.rstrip())
print()
# 埋め込み
print("左側に0を埋めて長さ10にする:")
print(s.str.pad(10, side="left", fillchar="0"))
スライスと連結
例
import pandas as pd
s = pd.Series(["hello", "world", "python", "pandas"])
print("元のデータ:")
print(s)
print()
# スライス
print("最初の3文字:")
print(s.str[:3])
print()
# 位置1から3文字取得
print("位置1から3文字取得:")
print(s.str[1:4])
print()
# 文字列連結
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("+ で連結:")
print(s1 + " " + s2)
print()
# join 連結(指定した区切り文字を使用)
print("join 連結:")
print(s1.str.cat(s2, sep="-"))
s = pd.Series(["hello", "world", "python", "pandas"])
print("元のデータ:")
print(s)
print()
# スライス
print("最初の3文字:")
print(s.str[:3])
print()
# 位置1から3文字取得
print("位置1から3文字取得:")
print(s.str[1:4])
print()
# 文字列連結
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("+ で連結:")
print(s1 + " " + s2)
print()
# join 連結(指定した区切り文字を使用)
print("join 連結:")
print(s1.str.cat(s2, sep="-"))
正規表現のサポート
Pandas の文字列関数は正規表現をサポートしており、複雑な文字列パターンを処理するための強力なツールです。
例
import pandas as pd
s = pd.Series([
"[email protected]",
"[email protected]",
"invalid-email",
"[email protected]"
])
print("元のデータ:")
print(s)
print()
# メールアドレスを抽出
print("ユーザー名を抽出:")
print(s.str.extract(r"(\w+)@"))
print()
print("ドメイン名を抽出:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()
# 置換
print("メールアドレスを [email] に置換:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()
# 包含マッチ
print(".com または .org を含む:")
print(s.str.contains(r"\.com|\.org"))
s = pd.Series([
"[email protected]",
"[email protected]",
"invalid-email",
"[email protected]"
])
print("元のデータ:")
print(s)
print()
# メールアドレスを抽出
print("ユーザー名を抽出:")
print(s.str.extract(r"(\w+)@"))
print()
print("ドメイン名を抽出:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()
# 置換
print("メールアドレスを [email] に置換:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()
# 包含マッチ
print(".com または .org を含む:")
print(s.str.contains(r"\.com|\.org"))
抽出と分割
例
import pandas as pd
s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])
print("元のデータ:")
print(s)
print()
# 年・月・日を抽出
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["年", "月", "日"]
print("年・月・日を抽出:")
print(extract_df)
print()
# 区切り文字で分割
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("カンマで分割:")
print(s2.str.split(","))
print()
# 分割して DataFrame に展開
print("分割して展開:")
print(s2.str.split(",", expand=True))
s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])
print("元のデータ:")
print(s)
print()
# 年・月・日を抽出
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["年", "月", "日"]
print("年・月・日を抽出:")
print(extract_df)
print()
# 区切り文字で分割
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("カンマで分割:")
print(s2.str.split(","))
print()
# 分割して DataFrame に展開
print("分割して展開:")
print(s2.str.split(",", expand=True))
統計と変換
長さとカウント
例
import pandas as pd
s = pd.Series(["hello", "world", "python", "pandas"])
print("元のデータ:")
print(s)
print()
# 文字列の長さ
print("文字列の長さ:")
print(s.str.len())
print()
# 文字のカウント
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("文字 'l' の出現回数:")
print(s2.str.count("l"))
s = pd.Series(["hello", "world", "python", "pandas"])
print("元のデータ:")
print(s)
print()
# 文字列の長さ
print("文字列の長さ:")
print(s.str.len())
print()
# 文字のカウント
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("文字 'l' の出現回数:")
print(s2.str.count("l"))
型変換
例
import pandas as pd
# 文字列を数値に変換
s = pd.Series(["1", "2", "3", "abc"])
print("文字列を数値に変換:")
print(pd.to_numeric(s, errors="coerce"))
print()
# 数値を文字列に変換
s2 = pd.Series([1, 2, 3, 4])
print("数値を文字列に変換:")
print(s2.astype(str).str.zfill(4)) # 4桁になるまでゼロ埋め
# 文字列を数値に変換
s = pd.Series(["1", "2", "3", "abc"])
print("文字列を数値に変換:")
print(pd.to_numeric(s, errors="coerce"))
print()
# 数値を文字列に変換
s2 = pd.Series([1, 2, 3, 4])
print("数値を文字列に変換:")
print(s2.astype(str).str.zfill(4)) # 4桁になるまでゼロ埋め
実践:データクリーニング
例
import pandas as pd
import numpy as np
# ダーティデータを作成
df = pd.DataFrame({
"名前": [" 山田太郎 ", "鈴木一郎", "佐藤三郎 "],
"電話番号": ["138-0000-0000", "13900000000", " 010-12345678 "],
"メールアドレス": ["[email protected]", "[email protected]", "[email protected] "]
})
print("元のデータ:")
print(df)
print()
# クリーニング手順
# 1. スペースを除去
df["名前"] = df["名前"].str.strip()
df["電話番号"] = df["電話番号"].str.replace("-", "").str.strip()
df["メールアドレス"] = df["メールアドレス"].str.strip().str.lower()
print("クリーニング後:")
print(df)
print()
# 2. データを検証
print("メールアドレス検証:")
print(df["メールアドレス"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
import numpy as np
# ダーティデータを作成
df = pd.DataFrame({
"名前": [" 山田太郎 ", "鈴木一郎", "佐藤三郎 "],
"電話番号": ["138-0000-0000", "13900000000", " 010-12345678 "],
"メールアドレス": ["[email protected]", "[email protected]", "[email protected] "]
})
print("元のデータ:")
print(df)
print()
# クリーニング手順
# 1. スペースを除去
df["名前"] = df["名前"].str.strip()
df["電話番号"] = df["電話番号"].str.replace("-", "").str.strip()
df["メールアドレス"] = df["メールアドレス"].str.strip().str.lower()
print("クリーニング後:")
print(df)
print()
# 2. データを検証
print("メールアドレス検証:")
print(df["メールアドレス"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
注意事項
1、欠損値の処理
文字列操作はデフォルトで欠損値(NaN)をスキップします。処理が必要な場合は、.fillna()先に埋めることができます。
2、大文字・小文字の区別
ほとんどの関数はデフォルトで大文字と小文字を区別します。case=Falseパラメータを使用すると、大文字と小文字を区別しないマッチングが可能です。
3、正規表現のパフォーマンス
正規表現は強力ですが比較的遅いため、大量のデータを処理する際はパフォーマンスに注意してください。
その他の拡張文字列処理はデータクリーニングの重要な要素です。適切に使用すれば、
.strアクセサはほとんどのテキスト処理タスクを効率的に完了できます。