行方向(縦方向)のデータを、文字列のマッチパターンでフィルタします。

元データ:data1

文字列の先頭or末尾でパターンマッチする

str.startswith()str.endswith()を使うことで、
「文字列hogeで始まる行を取り出す」、もしくは「文字列fugaで終わる行を取り出す」ことができます。

# occupation列に、"M"で始まる文字列がある行を取り出す
data1[data1['occupation'].str.startswith('M')]

# occupation列に、"t"で終わる文字列がある行を取り出す
data1[data1['occupation'].str.endswith('t')]

正規表現を用いてパターンマッチする

行フィルタのメソッドであるpandasのquery()は、文字列マッチがサポートしていません。
それゆえに、.str.contains()という、文字列検索のメソッドを利用します。
また、文字列マッチによる列選択と同様に、正規表現が使えます。
上記のstartswithとendswithを使わずとも、正規表現でも同じことができます。

# occupation列に、"s"を含む文字列がある行を取り出す(部分一致)
data1[data1["occupation"].str.contains("s")]

# occupation列に、"P"から始まる文字列がある行を取り出す
data1[data1["occupation"].str.contains("^P")]

# occupation列に、"y"で終わる文字列がある行を取り出す
data1[data1["occupation"].str.contains("y$")]

# occupation列に、"s"を含む文字列がある、かつ、gender列に"F"から始まる文字列がある行を取り出す
data1[data1["occupation"].str.contains("s") & data1["gender"].str.contains("^F") ]

最後の例の実行結果です。
ちゃんと意図通りのデータが取り出せていそうです。

中でやっていること

下記の処理について、見ていきます。

# occupation列に、"s"を含む文字列がある行を取り出す
data1[data1["occupation"].str.contains("s")]

data1[]の中身は何をやっているのか見てみると、先頭が”P”から始まる文字列かどうかのtrue/falseを返しています。

data1["occupation"].str.contains("^P")

さらに、見てみると、.str.contains()を適用する前に、occupation列の値を取得していることが分かります。

data1["occupation"]

つまり、対象の列の文字列に指定のパターンがヒットするかどうかをチェックし、そのチェック結果にもとづいて行を選択している、という流れになっています。

 

このフィルタ方法は、複雑な文字列を含むデータに出会った時に真価を発揮します。