【Pandas超解説】pandas.Series.str.rpartitionで文字列を分割! ファイルパスやURLをスマートに処理
pandas.Series.str.rpartition
は、pandas
シリーズの文字列を最後の区切り文字で分割し、3つの要素を含むタプルを返すメソッドです。
構文
series.str.rpartition(sep, expand=True)
引数
expand
: 結果をDataFrameとして返すかどうかを指定します。デフォルトはTrueです。sep
: 区切り文字となる文字列。デフォルトは空白です。
戻り値
- 区切り文字を含む3つの要素を持つタプルまたはDataFrame
- 要素1:区切り文字より前の部分
- 要素2:区切り文字
- 要素3:区切り文字より後の部分
例
以下の例では、ファイルパスを含むSeries
があり、最後の/
で分割して、ファイル名と拡張子を抽出します。
import pandas as pd
# ファイルパスのリストを含むSeriesを作成
paths = pd.Series(['data/csv/sample.csv', 'data/json/data.json'])
# ファイル名を抽出
filenames = paths.str.rpartition('/', expand=True)
print(filenames)
left mid right
0 data/csv / sample.csv
1 data/json / data.json
expand=False
に設定すると、Seriesとして結果を返します。- 区切り文字が見つからない場合は、空文字列2つと元の文字列を含むタプルを返します。
import pandas as pd
# ファイルパスのリストを含むSeriesを作成
paths = pd.Series(['data/csv/sample.csv', 'data/json/data.json'])
# ファイル名と拡張子を抽出
result = paths.str.rpartition('/', expand=True)
# ファイル名を抽出
filenames = result['right']
# 拡張子を抽出
extensions = result['mid']
print(f"ファイル名: {filenames}")
print(f"拡張子: {extensions}")
出力
ファイル名: sample.csv
data.json
拡張子: .csv
.json
pandas
ライブラリをインポートします。- ファイルパスのリストを含む
Series
を作成します。 str.rpartition
メソッドを使用して、ファイルパスを最後の/
で分割します。- 分割結果を
result
変数に格納します。 result
からright
列を抽出して、ファイル名をfilenames
変数に格納します。result
からmid
列を抽出して、拡張子をextensions
変数に格納します。- ファイル名と拡張子を表示します。
- 分割結果を新しい列として
Series
に追加 - 特定の条件に基づいて分割結果をフィルタリング
- 複数の区切り文字で分割
str.split() と -1 インデックスの使用
最も基本的な代替方法は、str.split()
メソッドと -1
インデックスを使用して、文字列を最後の区切り文字で分割する方法です。
import pandas as pd
# ファイルパスのリストを含むSeriesを作成
paths = pd.Series(['data/csv/sample.csv', 'data/json/data.json'])
# ファイル名と拡張子を抽出
filenames = paths.str.split('/', expand=True)[-1]
extensions = paths.str.split('.', expand=True)[1]
print(f"ファイル名: {filenames}")
print(f"拡張子: {extensions}")
出力
ファイル名: sample.csv
data.json
拡張子: .csv
.json
正規表現を使用する
正規表現を使用して、文字列を区切り文字で分割することもできます。
import pandas as pd
# ファイルパスのリストを含むSeriesを作成
paths = pd.Series(['data/csv/sample.csv', 'data/json/data.json'])
# ファイル名と拡張子を抽出
pattern = r'/(.*?)\.(.*)$'
result = paths.str.extract(pattern, expand=True)
filenames = result[0]
extensions = result[1]
print(f"ファイル名: {filenames}")
print(f"拡張子: {extensions}")
出力
ファイル名: sample
data
拡張子: csv
json
カスタム関数を使用する
独自のロジックで文字列を分割する必要がある場合は、カスタム関数を使用することができます。
import pandas as pd
def split_filename(path):
filename, ext = os.path.splitext(os.path.basename(path))
return filename, ext
# ファイルパスのリストを含むSeriesを作成
paths = pd.Series(['data/csv/sample.csv', 'data/json/data.json'])
# ファイル名と拡張子を抽出
result = paths.apply(split_filename)
filenames = result[0]
extensions = result[1]
print(f"ファイル名: {filenames}")
print(f"拡張子: {extensions}")
出力
ファイル名: sample
data
拡張子: csv
json
- 独自のロジックで分割する必要がある場合は、カスタム関数を使用します。
- より柔軟な分割が必要な場合は、正規表現を使用します。
- シンプルで分かりやすい方法が必要な場合は、
str.split()
と-1
インデックスの使用がおすすめです。