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でつなぐ方法がわかりました