【Pandas文字列操作】str.slice()でテキストの任意部分を高速抽出!


 

データ分析において、DataFrameやSeriesの文字列データから、特定の開始位置から指定した長さの部分だけを抽出したいというニーズは頻繁に発生します。例えば、製品コードから先頭の3文字だけを取り出したり、日付文字列から年だけを抽出したりするケースです。Pythonの通常の文字列スライスと同様の操作を、Pandasでは効率的に行うことができます。

Pandasは、Seriesの文字列操作メソッド(.strアクセサ)の一つとして**str.slice()**を提供しており、これにより文字列にスライスを適用して任意の位置・長さの部分を抽出できます。この記事では、str.slice()の基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

文字列スライスとは?なぜ部分抽出が必要なのか?

 

文字列スライスとは、文字列の一部を切り取って新しい文字列を生成する操作です。Pythonでは'文字列'[開始位置:終了位置:ステップ]という構文で広く使われています。

なぜデータ分析で文字列の部分抽出が必要なのでしょうか?

  • データクレンジング: 不要な接頭辞・接尾辞を取り除き、データの整形を行います。

  • 特徴量エンジニアリング: 複雑な文字列から、分析に必要な特定の意味を持つ部分だけを抽出して新たな特徴量を作成します。

  • データ統合: 異なる形式の文字列データから共通の部分を抽出し、結合や比較を容易にします。

  • 分類・集計: 部分文字列に基づいてデータをグループ化したり、カテゴリに分類したりします。


 

str.slice()の基本的な使い方

 

str.slice()メソッドは、Seriesの各文字列に対してPythonのスライス構文と同じように機能します。

 

指定した開始位置から末尾まで抽出

 

start引数に開始位置(インデックス)を指定します。

Python
 
import pandas as pd

# サンプルDataFrameの作成
df = pd.DataFrame({
    'ID': [1, 2, 3],
    '製品コード': ['XYZ-001-A', 'ABC-002-B', 'DEF-003-C'],
    '日付文字列': ['20230105', '20221120', '20240310']
})
print("オリジナルDataFrame:\n", df)

# '製品コード'からハイフン以降を抽出 (インデックス4から末尾まで)
df['製品番号'] = df['製品コード'].str.slice(start=4)
print("\n'製品コード'から製品番号を抽出後:\n", df)

解説:

  1. df['製品コード'].str.slice(start=4): '製品コード'列の各文字列に対してスライスを適用します。

  2. start=4は、インデックス4(0から数えて5番目の文字)から文字列の末尾までを抽出することを示します。

 

指定した開始位置から終了位置まで抽出

 

startstop引数を組み合わせて、特定の範囲を抽出します。stopで指定したインデックスの手前までが抽出されます(Pythonのスライスと同じく排他的)。

Python
 
# '日付文字列'から年を抽出 (インデックス0から4の手前まで)
df['年'] = df['日付文字列'].str.slice(start=0, stop=4)
print("\n'日付文字列'から年を抽出後:\n", df)

解説:

start=0, stop=4は、インデックス0から始まり、インデックス4の手前(つまり4文字目まで)を抽出します。これにより、’YYYY’形式の年が抽出されます。

 

負のインデックスを使った抽出(末尾から数える)

 

Pythonのスライスと同様に、負のインデックスを指定することで文字列の末尾から数えて抽出できます。

Python
 
# '製品コード'から最後の1文字(色コード)を抽出
df['色コード'] = df['製品コード'].str.slice(start=-1)
print("\n'製品コード'から色コードを抽出後:\n", df)

# '日付文字列'から月を抽出 (末尾から数えて4文字目から2文字分)
df['月'] = df['日付文字列'].str.slice(start=-4, stop=-2)
print("\n'日付文字列'から月を抽出後:\n", df)

解説:

  • start=-1: 文字列の末尾から1文字目を抽出します。

  • start=-4, stop=-2: 末尾から4文字目の位置(例: '20230105'0)から、末尾から2文字目の位置(例: '20230105'5)の手前までを抽出します。


 

str.slice()の応用的な使い方

 

 

ステップサイズを指定する: step引数

 

step引数を使うことで、指定した間隔で文字をスキップしながら抽出できます。

Python
 
df_step = pd.DataFrame({'データ': ['ABCDEFGHIJKL']})

# 1文字おきに抽出
df_step['飛び飛び'] = df_step['データ'].str.slice(start=0, step=2)
print("\n1文字おきに抽出後:\n", df_step)

# 逆順に抽出 (startとstopを省略し、step=-1)
df_step['逆順'] = df_step['データ'].str.slice(step=-1)
print("\n逆順に抽出後:\n", df_step)

解説:

  • step=2: 2文字ごとに抽出します。

  • step=-1: 文字列全体を逆順に抽出します。これは[::-1]というPythonのスライス記法と同じです。

 

欠損値(NaN)の扱い

 

str.slice()は、欠損値(NaN)がある場合でもエラーにならず、結果もNaNになります。

Python
 
df_nan = pd.DataFrame({'データ': ['ABC', 'DEF', None, 'GHI']})

df_nan['部分'] = df_nan['データ'].str.slice(start=1, stop=2)
print("\nNaNを含むデータにスライス適用後:\n", df_nan)

解説:

元のSeriesにNone(NaNとして扱われる)が含まれていても、str.slice()は適切にNaNを結果として返します。


 

str.slice()とPythonのスライス記法との違い

 

Pandasのstr.slice(start, stop, step)は、Pythonの文字列スライス[start:stop:step]とほぼ同じ挙動をしますが、PandasではDataFrame/Series全体にベクトル化して適用できる点が大きな違いです。

Pythonの直接的なスライス構文は、Seriesに対して直接は使えません(df['列名'][0:4]とすると、Series自体のスライスになり、各要素の文字列へのスライスではない)。そのため、各要素の文字列にスライスを適用するには.str.slice()を使用します。


 

まとめ

 

Pandasのstr.slice()メソッドは、DataFrameやSeriesの文字列データから、指定した開始位置、終了位置、そしてステップで部分文字列を効率的に抽出するための強力なツールです。Pythonの標準的なスライス構文と同じ感覚で使えるため、直感的に操作できます。

データクレンジング、特徴量エンジニアリング、そしてデータの統合など、様々なデータ前処理のタスクにおいて、str.slice()はその真価を発揮します。このメソッドを使いこなし、文字列データの加工をよりスムーズに進めていきましょう。