Step 9:文字列操作の基本

✂️ ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE