✂️ ステップ9: 文字列操作の基本
テキストデータを自由自在に扱おう!
ステップ8では、関数を作ってコードを整理する方法を学びました。今回は、文字列(テキスト)を操作する方法を学びます。
📖 このステップで学ぶこと
・文字列の連結と繰り返し
・split()で文字列を分割する
・replace()で文字列を置換する
・strip()で余分な空白を削除する
・upper()、lower()で大文字小文字を変換する
・f-stringで文字列を整形する
・実践例:データクリーニング
🎯 1. なぜ文字列操作が重要なのか?
データ分析では、数値だけでなく文字列(テキスト)も扱います。
🔰 データ分析での文字列の例
📌 実際によく扱う文字列データ
・顧客名の整理(” 山田 太郎 ” → “山田 太郎”)
・住所やメールアドレスの抽出
・カテゴリ名の統一(”TOKYO” → “tokyo”)
・日付の形式変換(”2024-12-25″ → “2024/12/25″)
・不要な空白の削除
・CSVファイルの処理(カンマで区切られたデータ)
🧹 データクリーニングとは?
💡 データクリーニングの重要性
データクリーニングとは、データを分析する前に、データをきれいに整える作業です。
例えば:
・余分な空白を削除する
・大文字と小文字を統一する
・データの形式を揃える
・不要な文字を削除する
文字列操作は、この作業に欠かせません!
📝 今まで学んだ文字列の操作
コード:基本的な文字列操作の復習
# 文字列の基本
name = "太郎"
message = "こんにちは、" + name + "さん"
print(message)
# f-string
age = 25
print(f"{name}さんは{age}歳です")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
こんにちは、太郎さん 太郎さんは25歳です
今回は、さらに便利な文字列操作の方法を学びます。
➕ 2. 文字列の連結と繰り返し
🔰 文字列の連結(+)
+演算子を使って、複数の文字列をつなげることができます。
コード:文字列を連結する
# 文字列の連結
first_name = "山田"
last_name = "太郎"
full_name = first_name + last_name
print(full_name)
# スペースを入れる
full_name_space = first_name + " " + last_name
print(full_name_space)
# 複数の文字列を連結
greeting = "こんにちは、" + first_name + last_name + "さん!"
print(greeting)
実行結果
山田太郎 山田 太郎 こんにちは、山田太郎さん!
💡 コードの解説
first_name + last_name
・+演算子で2つの文字列を連結します
・”山田” + “太郎” = “山田太郎”
first_name + ” ” + last_name
・間にスペースを入れることもできます
・”山田” + ” ” + “太郎” = “山田 太郎”
🔰 文字列の繰り返し(*)
*演算子を使って、文字列を繰り返すことができます。
コード:文字列を繰り返す
# 文字列を3回繰り返す
print("こんにちは" * 3)
# 記号の繰り返し
print("=" * 20)
print("タイトル")
print("=" * 20)
# 空白の作成
indent = " " * 4
print(indent + "インデントされた文字")
実行結果
こんにちはこんにちはこんにちは
====================
タイトル
====================
インデントされた文字
💡 便利な使い方
“=” * 20
・”=”を20回繰り返します
・区切り線を作るのに便利です
” ” * 4
・スペースを4つ作ります
・インデント(字下げ)を作るのに使えます
📌 f-stringの方が便利!
文字列の連結は+でもできますが、f-stringを使う方が読みやすいです。
変数や式も簡単に埋め込めます。
# +での連結
name = "太郎"
age = 25
message1 = "こんにちは、" + name + "さん。" + str(age) + "歳ですね。"
# f-string(こちらが推奨)
message2 = f"こんにちは、{name}さん。{age}歳ですね。"
✂️ 3. split() – 文字列を分割する
split()メソッドは、文字列を指定した区切り文字で分割してリストにします。
🔰 スペースで分割(デフォルト)
コード:スペースで分割
# スペースで分割(デフォルト)
text = "りんご みかん バナナ ぶどう"
fruits = text.split()
print(fruits)
print(type(fruits))
実行結果
['りんご', 'みかん', 'バナナ', 'ぶどう'] <class 'list'>
💡 コードの解説
text.split()
・split()は文字列を分割するメソッドです
・引数を省略すると、スペース、タブ、改行で分割します
・結果はリストで返されます
結果の説明:
・”りんご みかん バナナ ぶどう”という1つの文字列が
・[‘りんご’, ‘みかん’, ‘バナナ’, ‘ぶどう’]という4つの要素を持つリストになります
📝 区切り文字を指定する
コード:カンマで分割
# カンマで分割
csv_data = "東京,大阪,名古屋,福岡"
cities = csv_data.split(",")
print(cities)
# スラッシュで分割(日付)
date = "2024/12/25"
year, month, day = date.split("/")
print(f"年: {year}")
print(f"月: {month}")
print(f"日: {day}")
実行結果
['東京', '大阪', '名古屋', '福岡'] 年: 2024 月: 12 日: 25
💡 複数の変数で受け取る
year, month, day = date.split(“/”)
・split(“/”)で[“2024”, “12”, “25”]というリストができます
・それを3つの変数で同時に受け取ります
・year=”2024″、month=”12″、day=”25″になります
注意:
・変数の数と分割後の要素数が一致しないとエラーになります
📘 実践例:CSVデータの処理
コード:CSV形式のデータを処理
# CSVの1行を処理
csv_line = "山田太郎,25,東京都,営業部"
data = csv_line.split(",")
name = data[0]
age = int(data[1])
address = data[2]
department = data[3]
print(f"名前: {name}")
print(f"年齢: {age}歳")
print(f"住所: {address}")
print(f"部署: {department}")
実行結果
名前: 山田太郎 年齢: 25歳 住所: 東京都 部署: 営業部
📌 splitの便利な使い方
| 使い方 | 説明 |
| split() | 空白で分割(スペース、タブ、改行) |
| split(“,”) | カンマで分割(CSV形式) |
| split(“/”) | スラッシュで分割(日付など) |
| split(“\n”) | 改行で分割(複数行のテキスト) |
🔄 4. replace() – 文字列を置換する
replace()メソッドは、文字列の中の特定の部分を別の文字列に置き換えます。
🔰 文字列の置換
コード:文字列を置き換える
# 文字列の置換
text = "私はりんごが好きです"
new_text = text.replace("りんご", "みかん")
print(new_text)
# 元の文字列は変わらない
print(text)
実行結果
私はみかんが好きです 私はりんごが好きです
💡 コードの解説
text.replace(“りんご”, “みかん”)
・第1引数:”りんご”(置き換え前)
・第2引数:”みかん”(置き換え後)
・”りんご”を”みかん”に置き換えた新しい文字列を返します
元の文字列は変わらない:
・replace()は新しい文字列を返すだけです
・元の変数textの値は変わりません
・これは多くの文字列メソッドに共通する特徴です
🔑 重要なポイント
Pythonの文字列はイミュータブル(変更不可)です。
文字列メソッドは、常に新しい文字列を返します。
元の文字列自体は変更されません。
変更結果を使うには、変数に代入する必要があります:
text = text.replace(“りんご”, “みかん”)
📝 複数回の置換
コード:全ての文字を置換
# 全ての「a」を「A」に置換
text = "banana"
new_text = text.replace("a", "A")
print(new_text)
# スペースを削除
phone = "090 1234 5678"
clean_phone = phone.replace(" ", "")
print(clean_phone)
# ハイフンをスラッシュに
date = "2024-12-25"
formatted_date = date.replace("-", "/")
print(formatted_date)
実行結果
bAnAnA 09012345678 2024/12/25
💡 複数の置換
replace()は、該当する全ての部分を置き換えます。
例:”banana”の中の3つの”a”が全て”A”になります。
📘 実践例:データのクリーニング
コード:データを整形する
# カンマを削除
text = "価格は1,000円です"
text = text.replace(",", "")
print(text)
# 複数の記号を削除
email = "user@@@example..com"
clean_email = email.replace("@@@", "@").replace("..", ".")
print(clean_email)
実行結果
価格は1000円です user@example.com
💡 連続した置換
email.replace(“@@@”, “@”).replace(“..”, “.”)
・replace()を連続して呼び出せます
・最初に”@@@”を”@”に置き換え
・次に”..”を”.”に置き換えます
・これをメソッドチェーンと呼びます
🧹 5. strip() – 余分な空白を削除する
strip()メソッドは、文字列の両端にある空白を削除します。
🔰 両端の空白を削除
コード:空白を削除する
# 両端の空白を削除
text = " こんにちは "
clean_text = text.strip()
print(f"元: [{text}]")
print(f"後: [{clean_text}]")
実行結果
元: [ こんにちは ] 後: [こんにちは]
💡 コードの解説
text.strip()
・文字列の両端にある空白を削除します
・スペース、タブ、改行などが削除されます
・途中の空白は削除されません
[]で囲んで表示すると、空白があるかどうかわかりやすいです。
📝 左側・右側だけ削除
コード:片側だけ削除
text = " こんにちは "
# 左側の空白だけ削除
print(f"[{text.lstrip()}]")
# 右側の空白だけ削除
print(f"[{text.rstrip()}]")
# 両側削除
print(f"[{text.strip()}]")
実行結果
[こんにちは ] [ こんにちは] [こんにちは]
📌 stripの種類
| メソッド | 説明 |
| strip() | 両端の空白を削除 |
| lstrip() | 左側(left)の空白を削除 |
| rstrip() | 右側(right)の空白を削除 |
📘 実践例:ユーザー入力のクリーニング
コード:入力データを整える
# ユーザーが入力した名前を整える
user_input = " 山田 太郎 "
clean_name = user_input.strip()
print(f"クリーニング後: [{clean_name}]")
# 複数のデータをクリーニング
data_list = [" 東京 ", "大阪 ", " 名古屋"]
clean_list = [item.strip() for item in data_list]
print(clean_list)
実行結果
クリーニング後: [山田 太郎] ['東京', '大阪', '名古屋']
💡 リスト内包表記との組み合わせ
[item.strip() for item in data_list]
・リスト内包表記を使っています
・data_listの各要素にstrip()を適用
・全ての要素の空白が削除された新しいリストができます
⚠️ 空白の種類
strip()が削除する「空白」には、以下が含まれます:
・スペース(” “)
・タブ(”\t”)
・改行(”\n”)
・その他の空白文字
文字列の途中の空白は削除されません。
🔤 6. upper()とlower() – 大文字小文字の変換
英語の文字列を、全て大文字または全て小文字に変換できます。
🔰 大文字・小文字に変換
コード:大文字小文字の変換
# 大文字に変換
text = "Hello World"
upper_text = text.upper()
print(upper_text)
# 小文字に変換
lower_text = text.lower()
print(lower_text)
# 元の文字列
print(text)
実行結果
HELLO WORLD hello world Hello World
💡 コードの解説
text.upper()
・全ての英字を大文字に変換します
・”Hello World” → “HELLO WORLD”
text.lower()
・全ての英字を小文字に変換します
・”Hello World” → “hello world”
日本語には影響しません:
・upper()、lower()は英字にのみ作用します
・日本語や数字は変わりません
📝 先頭だけ大文字にする
コード:capitalize()とtitle()
# 先頭だけ大文字
text = "hello world"
print(text.capitalize())
# 各単語の先頭を大文字に
print(text.title())
実行結果
Hello world Hello World
💡 違い
capitalize() – 最初の1文字だけ大文字
title() – 各単語の最初を大文字(タイトルケース)
📘 実践例:大文字小文字を無視した比較
コード:大文字小文字を統一して比較
# ユーザー入力を小文字に統一して比較
user_input = "YES"
answer = "yes"
# そのまま比較(失敗)
print(user_input == answer)
# 小文字に統一して比較(成功)
print(user_input.lower() == answer.lower())
実行結果
False True
💡 大文字小文字を区別しない比較
ユーザー入力など、大文字小文字が不確定な場合:
・両方を小文字(または大文字)に統一してから比較します
・これで”YES”、”yes”、”Yes”などを全て同じとして扱えます
📘 実践例:メールアドレスの正規化
コード:メールアドレスを小文字に統一
# メールアドレスは小文字に統一
emails = ["USER@Example.com", "admin@EXAMPLE.COM", "Test@example.COM"]
normalized = [email.lower() for email in emails]
for email in normalized:
print(email)
実行結果
user@example.com admin@example.com test@example.com
📝 7. f-string(フォーマット文字列)
f-stringは、文字列の中に変数や式を埋め込む便利な方法です。
🔰 f-stringの基本
📌 f-stringの使い方
文字列の前にfをつけて、{ }の中に変数や式を書きます。
f"文字列 {変数} 文字列"
コード:f-stringの基本
# 変数を埋め込む
name = "太郎"
age = 25
print(f"{name}さんは{age}歳です")
# 式を埋め込む
price = 1000
quantity = 3
print(f"合計: {price * quantity}円")
実行結果
太郎さんは25歳です 合計: 3000円
💡 f-stringの便利さ
f”{name}さんは{age}歳です”
・{name}の部分に変数nameの値が入ります
・{age}の部分に変数ageの値が入ります
f”合計: {price * quantity}円”
・{ }の中に式も書けます
・price * quantityが計算されて、結果が埋め込まれます
📝 数値のフォーマット
コード:数値を整形する
# 小数点以下の桁数を指定
pi = 3.14159265
print(f"円周率: {pi:.2f}") # 小数点以下2桁
print(f"円周率: {pi:.4f}") # 小数点以下4桁
# カンマ区切り
price = 1234567
print(f"価格: {price:,}円")
# 右寄せ・左寄せ
name = "太郎"
print(f"|{name:>10}|") # 右寄せ(幅10)
print(f"|{name:<10}|") # 左寄せ(幅10)
print(f"|{name:^10}|") # 中央寄せ(幅10)
実行結果
円周率: 3.14 円周率: 3.1416 価格: 1,234,567円 | 太郎| |太郎 | | 太郎 |
📌 f-stringのフォーマット指定
| 書式 | 意味 | 例 |
| :.2f | 小数点以下2桁 | {pi:.2f} → 3.14 |
| :, | 3桁区切りカンマ | {price:,} → 1,234,567 |
| :>10 | 右寄せ(幅10) | {name:>10} |
| :<10 | 左寄せ(幅10) | {name:<10} |
| :^10 | 中央寄せ(幅10) | {name:^10} |
🔍 8. その他の便利な文字列メソッド
📘 文字列の検索
コード:文字列の検索
text = "Python データ分析入門"
# 文字列が含まれるかチェック
print("Python" in text)
print("Java" in text)
# 先頭・末尾のチェック
print(text.startswith("Python"))
print(text.endswith("入門"))
# 位置を検索
print(text.find("データ"))
print(text.find("Java")) # 見つからないと-1
実行結果
True False True True 7 -1
📘 文字列の判定
コード:文字列の種類を判定
# 数字だけか?
print("12345".isdigit())
print("123abc".isdigit())
# アルファベットだけか?
print("Hello".isalpha())
print("Hello123".isalpha())
# 英数字だけか?
print("Hello123".isalnum())
print("Hello 123".isalnum())
実行結果
True False True False True False
📘 文字列の結合(join)
コード:リストを文字列に結合
# リストを文字列に結合
fruits = ["りんご", "みかん", "バナナ"]
text = "、".join(fruits)
print(text)
# スペース区切り
words = ["Hello", "World", "Python"]
sentence = " ".join(words)
print(sentence)
# 改行で結合
lines = ["1行目", "2行目", "3行目"]
text = "\n".join(lines)
print(text)
実行結果
りんご、みかん、バナナ Hello World Python 1行目 2行目 3行目
💡 join()の使い方
"、".join(fruits)
・リストの要素を、指定した文字列で結合します
・"、"で結合するので、要素の間に「、」が入ります
・split()の逆の操作です
🧹 9. 実践:データクリーニング
📘 例1:顧客名簿のクリーニング
コード:名前データを整える
# 問題のあるデータ
messy_data = [
" 山田 太郎 ",
"佐藤花子",
" 田中 次郎",
"鈴木 三郎 "
]
# クリーニング関数
def clean_name(name):
# 1. 両端の空白を削除
name = name.strip()
# 2. 複数の空白を1つに
name = " ".join(name.split())
return name
# データをクリーニング
clean_data = [clean_name(name) for name in messy_data]
print("【クリーニング前】")
for name in messy_data:
print(f"[{name}]")
print("\n【クリーニング後】")
for name in clean_data:
print(f"[{name}]")
実行結果
【クリーニング前】 [ 山田 太郎 ] [佐藤花子] [ 田中 次郎] [鈴木 三郎 ] 【クリーニング後】 [山田 太郎] [佐藤花子] [田中 次郎] [鈴木 三郎]
💡 複数の空白を1つにする技
" ".join(name.split())
1. name.split() - 空白で分割してリストにする
2. " ".join() - スペース1つで結合する
結果:複数の空白が1つになります
📘 例2:電話番号の統一
コード:電話番号をハイフン区切りに統一
# 様々な形式の電話番号
phone_numbers = [
"090-1234-5678",
"080 9876 5432",
"070-1111-2222",
"09012345678"
]
# ハイフン区切りに統一する関数
def format_phone(phone):
# ハイフンとスペースを削除
clean = phone.replace("-", "").replace(" ", "")
# ハイフン区切りに整形
if len(clean) == 11:
return f"{clean[0:3]}-{clean[3:7]}-{clean[7:11]}"
else:
return "形式エラー"
# 統一
formatted = [format_phone(phone) for phone in phone_numbers]
for original, formatted in zip(phone_numbers, formatted):
print(f"{original:20} → {formatted}")
実行結果
090-1234-5678 → 090-1234-5678 080 9876 5432 → 080-9876-5432 070-1111-2222 → 070-1111-2222 09012345678 → 090-1234-5678
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:文字列の分割(初級)
📋 問題
"東京,神奈川,千葉,埼玉"という文字列を、カンマで分割してリストにしてください。
解答例を見る
コード
text = "東京,神奈川,千葉,埼玉"
prefectures = text.split(",")
print(prefectures)
print(f"都県数: {len(prefectures)}")
実行結果
['東京', '神奈川', '千葉', '埼玉'] 都県数: 4
問題2:文字列の置換(初級)
📋 問題
"I love Python"という文字列の"Python"を"programming"に置き換えてください。
解答例を見る
コード
text = "I love Python"
new_text = text.replace("Python", "programming")
print(new_text)
実行結果
I love programming
問題3:名前のフォーマット(中級)
📋 問題
" yamada taro "という文字列(前後に余分な空白あり)を、先頭を大文字にして"Yamada Taro"の形式にしてください。
解答例を見る
コード
name = " yamada taro "
# 1. 空白を削除
name = name.strip()
# 2. 各単語の先頭を大文字に
name = name.title()
print(name)
実行結果
Yamada Taro
問題4:メールアドレスの検証(中級)
📋 問題
文字列がメールアドレスの形式かどうかを判定する関数is_valid_emailを作成してください。
条件: @が1つだけ含まれており、@の前後に文字がある
解答例を見る
コード
def is_valid_email(email):
# @の個数をチェック
if email.count("@") != 1:
return False
# @で分割
parts = email.split("@")
# 前後に文字があるかチェック
if len(parts[0]) > 0 and len(parts[1]) > 0:
return True
else:
return False
# テスト
test_emails = [
"user@example.com",
"invalid@@example.com",
"@example.com",
"user@",
"user.example.com"
]
for email in test_emails:
result = "有効" if is_valid_email(email) else "無効"
print(f"{email:25} → {result}")
実行結果
user@example.com → 有効 invalid@@example.com → 無効 @example.com → 無効 user@ → 無効 user.example.com → 無効
🎯 このステップのまとめ
✅ 学んだこと
✓ split()で文字列を分割できる
✓ replace()で文字列を置換できる
✓ strip()で余分な空白を削除できる
✓ upper()/lower()で大文字小文字を変換できる
✓ f-stringで文字列を整形できる
✓ join()でリストを文字列に結合できる
✓ 文字列メソッドは元の文字列を変更しない
✓ データクリーニングの基本テクニック
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ split()で文字列を分割できる
□ replace()で文字列を置換できる
□ strip()で空白を削除できる
□ f-stringで変数を埋め込める
□ 実際のデータをクリーニングできる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: 文字列メソッドを使っても元の文字列が変わらないのはなぜ?
A: Pythonの文字列はイミュータブル(変更不可)だからです。
文字列メソッドは常に新しい文字列を返します。
変更結果を使うには、変数に代入する必要があります。
text = text.replace("a", "b")
Q2: split()で複数の区切り文字を指定できますか?
A: split()では1種類の区切り文字しか指定できません。
複数の区切り文字で分割したい場合は、replace()で統一してからsplit()するか、正規表現(re.split)を使います。
Q3: 文字列の途中の空白を削除するには?
A: replace(" ", "")で全ての空白を削除できます。
または" ".join(text.split())で複数の空白を1つにまとめることができます。
Q4: f-stringと+での連結、どちらを使うべき?
A: f-stringを使う方が推奨されます。
読みやすく、式も埋め込めて、パフォーマンスも良いです。
+での連結は文字列が少ない場合のみ使います。
Q5: 日本語の文字列でも同じメソッドが使えますか?
A: はい、すべてのメソッドが使えます。
Python 3では日本語(Unicode)が標準でサポートされているので、英語と同じように扱えます。
学習メモ
Pythonデータ分析入門 - Step 9