【Python入門】特定の文字列を含むデータの抽出

contains pandas

Excelのフィルタのように、特定の文字列を含むデータを抽出する方法です。

pandasのデータフレームで、指定した条件の行を取得します。

サンプルデータ

東京都のオープンデータセットから認可保育所の一覧を使用します。
以下のリンクをクリックすると、CSVファイルがダウンロードされます。

/ 組織/ 東京都福祉保健局/ 社会福祉施設等一覧(令和元年5月1日時点)/ 認可保育所
URL: http://www.opendata.metro.tokyo.jp/fukushihoken/R0105/201905-2-1-hoikusyo.csv

CSVファイルの読み込み

pandasでCSVファイルを読み込みます。

このCSVファイルは、WindowsのCP932(ANSI)フォーマットで作成されています。
読み込み時に、フォーマットを指定しないとエラーになりますので、注意してください。

import pandas as pd
df_ninkaen = pd.read_csv('/Users/user/Desktop/201905-2-1-hoikusyo.csv', encoding='cp932')
df_ninkaen[['設置', '施設名', '所在地']].head()
        設置    	施設名          	所在地
0	区市町村	いずみこども園   	千代田区神田和泉町1
1	営利法人	あい保育園東神田	千代田区東神田2-6-5 東神田ビル2・3階
2	社福法人	千代田せいが保育園	千代田区神田岩本町15-7
3	営利法人	ベネッセ内神田保育園	千代田区内神田2-1-13
4	区市町村	神田保育園      	千代田区神田淡路町2-109

Windows環境で、デスクトップに保存したファイルを読み込む例です。
pandasのDataFrameで作った配列df_ninkaenに、データを読み込みました。

URLを指定すると、インターネット上に配置されたファイルを読み込むことができます。

url_tokyo = 'http://www.opendata.metro.tokyo.jp/fukushihoken/R0105/201905-2-1-hoikusyo.csv'
df_ninkaen = pd.read_csv(url_tokyo, encoding='cp932')


カラムがたくさんあるので、「設置、施設名、所在地」の3項目を使用します。

CSVファイルの読み込む方法は、以下の記事をご覧ください。
>>【Python入門】CSVファイルをコード1行で読み込む方法

文字列が完全一致

配列df_ninkaenのデータと、抽出したい文字列がすべて同じとき (完全一致) は、pandasのisinメソッドで抽出できます。

pandas.isin()

1つ目のカラム「設置」のデータが、文字列「事務組合」の行を抽出します。

df_ninkaen[['設置', '施設名', '所在地']][df_ninkaen['設置'].isin(['事務組合'])]
        設置	   施設名                    	所在地
982	事務組合   生活クラブ保育園ぽむ・砧	世田谷区砧4-38-4 グランドテラス1階
2765	事務組合   生活クラブ保育園ぽむ・国分寺	国分寺市泉町3-33-2 西晴ビル1階
2784	事務組合   さくらっこ保育園           	国立市中1-16-25 シャトレクインテスビル2F

カラム「設置」が、文字列「事務組合」に完全一致する3行のデータが抽出されました。

文字列「事務組合」を「組合」に変更します。

df_ninkaen[['設置', '施設名', '所在地']][df_ninkaen['設置'].isin(['組合'])]
設置	施設名	所在地

カラム「設置」が、文字列「組合」に完全一致するデータはありませんでした。

文字列「事務組合」と文字列「組合」は、別の文字列として判定されます。

文字列が部分一致(〇〇を含む)

配列df_ninkaenのデータに、抽出したい文字列が含まれているとき (部分一致) は、pandasのstr.containsメソッドで抽出できます。

pandas.str.contains()

1つ目のカラム「設置」のデータが、文字列「組合」を含む行を抽出します。

df_ninkaen[['設置', '施設名', '所在地']][df_ninkaen['設置'].str.contains('組合')]
        設置	   施設名                    	所在地
982	事務組合   生活クラブ保育園ぽむ・砧	世田谷区砧4-38-4 グランドテラス1階
2765	事務組合   生活クラブ保育園ぽむ・国分寺	国分寺市泉町3-33-2 西晴ビル1階
2784	事務組合   さくらっこ保育園           	国立市中1-16-25 シャトレクインテスビル2F

「設置」のデータで、「組合」を含んでいる(部分一致)データが抽出されました。

文字列「事務組合」は、文字列「組合」を含んでいるため、条件に一致すると判定されます。

複数の条件で抽出(and、or)

複数の条件でデータを抽出することができます。

抽出条件を括弧()でかこみ、論理演算子(&、|)でつなぎます。
・A and B : A かつ B は、「&」
・A or B : A または B は、「|」

1つ目のカラム「設置」のデータが、文字列「市」を含み、
かつ、3つ目のカラム「所在地」に、文字列「多摩」を含む行を抽出します

df_ninkaen[['設置', '施設名', '所在地']][(df_ninkaen['設置'].str.contains('市'))&
                                         (df_ninkaen['所在地'].str.contains('多摩'))]
        設置	   施設名	         所在地
2711	区市町村   たまだいら保育園	 日野市多摩平4丁目4番地の2
2738	区市町村   東村山市立第三保育園	 東村山市多摩湖町1-23-4
2889	区市町村   多摩保育園	         多摩市和田418-1
2892	区市町村   貝取保育園	         多摩市貝取4-10
2989	区市町村   石畑保育園	         西多摩郡瑞穂町大字石畑1837番地
2991	区市町村   むさしの保育園	 西多摩郡瑞穂町むさし野一丁目5番地

カラム「設置」が、文字列「市」を含むデータ「区市町村」で、
カラム「所在地」に、文字列「多摩」を含むデータが抽出されました。

query関数で書き換え

pandasでデータを抽出するには、上記のようなブールインデックス参照を使う方法の他に、query関数を使う方法があります。
複数の条件で抽出する場合は、条件式が長くなってしまうので、データフレーム名の記述が一度でよいquery関数はおすすめです。

上記の例をquery関数で書き換えてみます。

df_ninkaen[['設置', '施設名', '所在地']].query('設置.str.contains("市") & \
                                                所在地.str.contains("多摩")', engine='python')
        設置	   施設名	         所在地
2711	区市町村   たまだいら保育園	 日野市多摩平4丁目4番地の2
2738	区市町村   東村山市立第三保育園	 東村山市多摩湖町1-23-4
2889	区市町村   多摩保育園	         多摩市和田418-1
2892	区市町村   貝取保育園	         多摩市貝取4-10
2989	区市町村   石畑保育園	         西多摩郡瑞穂町大字石畑1837番地
2991	区市町村   むさしの保育園	 西多摩郡瑞穂町むさし野一丁目5番地


query関数の使い方は、以下をご覧ください。
【Python入門】文字列の部分一致による抽出(query関数)

まとめ

  • isinを使って、文字列が一致するデータを抽出できました
  • str.containを使って、文字列の一部を含むデータを抽出できました
  • 複数の抽出条件を、andでつなぐ方法がわかりました

関連情報

タイトルとURLをコピーしました