Pandas Series.str.split() 関数
Series.str.split()は、Pandas で文字列を分割するための関数です。
データ処理の過程では、文字列を複数の部分に分割する必要がよくあります。例えば、文を単語に分割したり、カンマ区切りの値をリストに分割したりします。split()関数は、指定した区切り文字に従って文字列を複数の部分に分割できます。
単語の意味:splitは「分ける、分割する」という意味で、文字列を複数の部分に分割することを表します。
基本構文とパラメータ
str.split()は Series の文字列アクセサメソッドです。そのため、まず文字列を含む Series を用意する必要があり、その後.strアクセサを使用して呼び出します。
構文形式
Series.str.split(pat=None, n=-1, expand=False)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| pat | str | 任意 | 区切り文字。文字列または正規表現を指定できます。デフォルトは空白文字です。 | None(空白文字) |
| n | int | 任意 | 分割する回数。-1 は制限なしを意味し、可能な限り多くの部分に分割します。 | -1 |
| expand | bool | 任意 | 結果を DataFrame に展開するかどうか。デフォルトは False(リストの Series を返します)。 | False |
関数の説明
- 戻り値:デフォルトでは、リストを含む Series を返します。各リストの要素は分割後の部分文字列です。
expand=Trueの場合、DataFrame を返します。 - 効果:指定した区切り文字に従って、各文字列を複数の部分に分割します。
- 注意:デフォルトでは空白文字を区切り文字として使用します。区切り文字はカスタマイズできます。
実例
簡単なものから複雑なものまでの一連の例を通して、str.split()の使い方を完全にマスターしましょう。
例1:基本的な使い方 - 空白文字による分割
実例
import pandas as pd
# 文を含む Series を作成する
s = pd.Series(['hello world', 'サンプル python', 'pandas data analysis'])
# 空白文字で分割(デフォルト動作)
result = s.str.split()
print("原始 Series:")
print(s)
print("n分割後の結果:")
print(result)
# 文を含む Series を作成する
s = pd.Series(['hello world', 'サンプル python', 'pandas data analysis'])
# 空白文字で分割(デフォルト動作)
result = s.str.split()
print("原始 Series:")
print(s)
print("n分割後の結果:")
print(result)
出力結果:
原始 Series: 0 hello world 1 サンプル python 2 pandas data analysis dtype: object 拆分后的结果: 0 [hello, world] 1 [サンプル, python] 2 [pandas, data, analysis]
コードの解説:
s.str.split()デフォルトでは空白文字(スペース、タブなど)で文字列を分割します。- 戻り値はリストを含む Series であり、各リストには分割後の部分文字列が含まれます。
- 'pandas data analysis' は3つの部分に分割されます。
例2:指定した区切り文字による分割
によって、patパラメータでカスタムの区切り文字を指定できます。
実例
import pandas as pd
# カンマ区切りの値を含む Series を作成する
s = pd.Series(['apple,banana,orange', 'dog,cat,bird', 'red,green,blue'])
# 按逗号拆分
result = s.str.split(',')
print("原始 Series:")
print(s)
print("nをカンマで分割した結果:")
print(result)
# カンマ区切りの値を含む Series を作成する
s = pd.Series(['apple,banana,orange', 'dog,cat,bird', 'red,green,blue'])
# 按逗号拆分
result = s.str.split(',')
print("原始 Series:")
print(s)
print("nをカンマで分割した結果:")
print(result)
出力結果:
原始 Series: 0 apple,banana,orange 1 dog,cat,bird 2 red,green,blue dtype: object 拆分后的结果: 0 [apple, banana, orange] 1 [dog, cat, bird] 2 [red, green, blue]
コードの解説:
s.str.split(',')カンマで各文字列を分割します。- これは、CSVデータやカンマ区切り値を処理する一般的な方法です。
例3:分割回数の制限
によって、nパラメータで分割回数を制限できます。
実例
import pandas as pd
s = pd.Series(['a,b,c,d,e', '1,2,3,4,5'])
# 分割を2つの部分だけに限定
result_2 = s.str.split(',', n=2)
# 分割を1つの部分のみに制限(すなわち1回だけ分割)
result_1 = s.str.split(',', n=1)
print("原始 Series:")
print(s)
print(n制限を2つの部分に分割:)
print(result_2)
print(n制限を1つの部分に分割:)
print(result_1)
s = pd.Series(['a,b,c,d,e', '1,2,3,4,5'])
# 分割を2つの部分だけに限定
result_2 = s.str.split(',', n=2)
# 分割を1つの部分のみに制限(すなわち1回だけ分割)
result_1 = s.str.split(',', n=1)
print("原始 Series:")
print(s)
print(n制限を2つの部分に分割:)
print(result_2)
print(n制限を1つの部分に分割:)
print(result_1)
出力結果:
原始 Series: 0 a,b,c,d,e 1 1,2,3,4,5 dtype: object 限制拆分为 2 部分: 0 [a, b, c,d,e] 1 [1, 2, 3,4,5] 限制拆分为 1 部分: 0 [a, b,c,d,e] 1 [1, 2,3,4,5]
コードの解説:
n=2は、最大2つの部分に分割することを意味し、最後の部分には残りのすべての内容が含まれます。n=1は、最初の区切り文字の位置でのみ分割し、2つの部分を取得することを意味します。
例4:DataFrameへの展開
当 expand=Trueの場合、分割結果は DataFrame に展開されます。
実例
import pandas as pd
# カンマ区切りの値を含む Series を作成する
s = pd.Series(['apple,banana,orange', 'dog,cat,bird', 'red,green,blue'])
# DataFrameに展開
result = s.str.split(',', expand=True)
print("原始 Series:")
print(s)
print(nをDataFrameに展開:)
print(result)
print("nDataFrame 类型:", type(result))
# カンマ区切りの値を含む Series を作成する
s = pd.Series(['apple,banana,orange', 'dog,cat,bird', 'red,green,blue'])
# DataFrameに展開
result = s.str.split(',', expand=True)
print("原始 Series:")
print(s)
print(nをDataFrameに展開:)
print(result)
print("nDataFrame 类型:", type(result))
出力結果:
原始 Series:
0 apple,banana,orange
1 dog,cat,bird
2 red,green,blue
dtype: object
展开为 DataFrame:
0 1 2
0 apple banana orange
1 dog cat bird
2 red green blue
DataFrame 类型: <class 'pandas.core.frame.DataFrame'>
コードの解説:
expand=True分割結果を DataFrame に展開します。- 各列は分割後の1つの位置を表します。
- これは構造化データを処理する際に非常に便利です。
例5:正規表現を使用した分割
split()は、区切り文字として正規表現を使用することもサポートしています。
実例
import pandas as pd
# 異なる区切り文字を含む Series を作成する
s = pd.Series(['hello-world', 'サンプル_python', 'pandas#tutorial'])
# 正規表現で分割(-、_、# のいずれかに一致)
result = s.str.split(r'[-_#]')
print("原始 Series:")
print(s)
print("n按正则表达式拆分:")
print(result)
# 異なる区切り文字を含む Series を作成する
s = pd.Series(['hello-world', 'サンプル_python', 'pandas#tutorial'])
# 正規表現で分割(-、_、# のいずれかに一致)
result = s.str.split(r'[-_#]')
print("原始 Series:")
print(s)
print("n按正则表达式拆分:")
print(result)
出力結果:
原始 Series: 0 hello-world 1 サンプル_python 2 pandas#tutorial dtype: object 按正则表达式拆分: 0 [hello, world] 1 [サンプル, python] 2 [pandas, tutorial]
コードの解説:
r'[-_#]'は正規表現であり、'-'、'_'、'#' のいずれか1文字にマッチします。- 正規表現は、複数の異なる区切り文字を同時に処理できます。
例6:実際のデータの処理
実際のアプリケーションでは、split()は、他の関数と組み合わせて使用されることがよくあります。
実例
import pandas as pd
# ログから抽出したデータをシミュレーションする
logs = pd.Series([
'2024-01-01 10:30:45 ERROR Connection failed',
'2024-01-01 10:31:12 INFO User logged in',
'2024-01-01 10:32:00 WARNING Memory usage high'
])
# 拆分日志内容
log_parts = logs.str.split(r's+', expand=True)
print("原始日志:")
print(logs)
print(n分割後の DataFrame:)
print(log_parts)
# 重命名列
log_parts.columns = ['timestamp', 'level', 'message']
print("nリネーム後の結果:")
print(log_parts)
# ログから抽出したデータをシミュレーションする
logs = pd.Series([
'2024-01-01 10:30:45 ERROR Connection failed',
'2024-01-01 10:31:12 INFO User logged in',
'2024-01-01 10:32:00 WARNING Memory usage high'
])
# 拆分日志内容
log_parts = logs.str.split(r's+', expand=True)
print("原始日志:")
print(logs)
print(n分割後の DataFrame:)
print(log_parts)
# 重命名列
log_parts.columns = ['timestamp', 'level', 'message']
print("nリネーム後の結果:")
print(log_parts)
出力結果:
原始日志:
0 2024-01-01 10:30:45 ERROR Connection failed
1 2024-01-01 10:31:12 INFO User logged in
2 2024-01-01 10:32:00 WARNING Memory usage high
dtype: object
拆分后的 DataFrame:
0 1 2
0 2024-01-01 10:30:45 ERROR Connection failed
1 2024-01-01 10:31:12 INFO User logged in
2 2024-01-01 10:32:00 WARNING Memory usage high
重命名后的结果:
timestamp level message
0 2024-01-01 10:30:45 ERROR Connection failed
1 2024-01-01 10:31:12 INFO User logged in
2 2024-01-01 10:32:00 WARNING Memory usage high
コードの解説:
r's+'は1つ以上の空白文字にマッチし、ログを複数の部分に分割します。expand=True分割結果を DataFrame に展開します。- 列の名前を変更することで、各部分に簡単にアクセスして処理できます。
注意事項
str.split()デフォルトでは、空白文字が区切り文字として使用されます。- 当
expand=Falseの場合、リストを含む Series を返します。 - 当
expand=Trueの場合、DataFrame を返します。列数は最長の分割結果に応じて異なります。 - 文字列に区切り文字が含まれていない場合、返されるリストには1つの要素(元の文字列)だけが含まれます。
- 正規表現は区切り文字として使用でき、より柔軟な分割方法を提供します。
- Series に NaN 値が含まれている場合は、NaN を返します。
その他の拡張