文字列による条件抽出 - Python Pandas

 

{{DZ_TITLE}}
Python Pandasで、文字列を使った条件抽出を行う方法です。

基本形

文字列で検索条件を指定できます。

  • query方式
# 完全一致
df.query("Type =='すずめ'")
# 含まない場合
df.query("Type !='すずめ'")
  • df[df[~]]方式
# 完全一致
df[df['Type']=='すずめ']
# 部分一致 - 特定文字列を含む場合
df[df['Type'].str.contains('すず')]
# 先頭一致 - 先頭に特定文字列がある場合
df[df['Type'].str.startswith('すず')]
# 末尾一致 - 末尾に特定文字列がある場合
df[df['Type'].str.endswith('ずめ')]
# 正規表現で条件指定
df[df['Type'].str.match('^すず')]

# 含まない場合
df[df['Type']!='すずめ']
### ~ (Not) 演算子で、条件を反転させる
# 含まない場合
df[~df['Type'].str.contains('すず')]
# 先頭に特定文字列が無い場合
df[~df['Type'].str.startswith('すず')]
# 末尾に特定文字列がない場合
df[~df['Type'].str.endswith('ずめ')]
# 正規表現で条件を一致したものを除外する
df[~df['Type'].str.match('^すず')]

サンプル

Typeが「すずめ」の物だけを抽出する。
この対象は文字列です。

import pandas as pd

# テストデータ DataFrameを作成する
df = pd.DataFrame( {'No':[1,2,3], 'Type':['いぬ','ねこ','すずめ'], 'Voice':['わん','にゃん','ちゅん'] })

# すずめの情報だけを取り出す
df.query("Type =='すずめ'")

よくあるエラーメッセージ

ValueError: cannot mask with array containing NA / NaN values

文字列が未入力のNA(NaN)があるために、エラーが発生しています。
str.containsの様に一部 条件抽出を行う前に、NA(Nan)を解決する必要があります。

再現方法、解決方法

  1. テストデータ「test.csv」を用意します。
Number,Name,Detail,Age
1,Yamamoto,足が速い,47
2,Shinjo,御飯が大好き,22
3,Kawakami,,12
  1. Pythonを記述して実行します。
import pandas as pd
df = pd.read_csv('test.csv', encoding='utf8')
df
  1. 下記にハイライトした部分がNaNという値になっています。
    pandas-filter-str.png
  2. この値があると、文字列の場合条件抽出時にエラーが発生します。
df[df['Detail'].str.contains('足が速い')]
  1. 対策として、fillna というメソッドを使う事でNa(Nan)の空の値を別の値で埋め尽くします。
# 全てのカラムでNa(NaN)があった場合に''を代入します
df = df.fillna('')
# 'Detail'カラムにNa(NaN)があった場合だけ''を代入します
df = df.fillna({'Detail':''})
df

pandas-filter-str.png 6. この場合エラーが発生せず、しっかりと検索が完了します。

df[df['Detail'].str.contains('足が速い')]

pandas-filter-str.png

複数条件を指定して検索

query メソッド時の複数検索条件

or , and を使う事が可能

df.query("Type=='すずめ' or Type=='いぬ'")
df.query("Type=='すずめ' and Type=='いぬ'")

df[df[~]]の場合の複数条件

  1. & | ~ オペレータ(記号)を使う。
    and は &
    or は |
    not は ~
  2. df[~]内の条件はそれぞれ()で囲む必要がある。
df[(df['Type']=='すずめ') | (df['Type']=='いぬ')]
df[(df['Type']=='すずめ') & (df['Type']=='いぬ')]
df[~(df['Type']=='すずめ') & ~(df['Type']=='いぬ')]  

関連

数値による条件抽出 - Python Pandas徹底解説
日時による条件抽出 - Python Pandas徹底解説
Python - Pandas徹底解説

おすすめ記事

エラーを解消したい PermissionError: [Errno 13] Permission denied: ファイル名 - Python
エラーを解消したい PermissionError: [Errno 13] Permission denied: ファイル名 - Python
OpenCV - Python徹底解説
OpenCV - Python徹底解説
Blenderで3D 目次 - Python
Blenderで3D 目次 - Python
国土地理院 標高タイル テキスト版を使って、ディズニーシーのプロメテウス火山を可視化
国土地理院 標高タイル テキスト版を使って、ディズニーシーのプロメテウス火山を可視化
Raspberry pi Liteの非X Window環境でJackdを動かす
Raspberry pi Liteの非X Window環境でJackdを動かす
contents.jsからbackground.jsにメッセージを渡す方法 / Chrome extension
contents.jsからbackground.jsにメッセージを渡す方法 / Chrome extension
Supponsered

外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!

Comments

comments powered by Disqus