yskma’s blog

日々の作業の備忘録@株式会社ビズオーシャン

pandasでの正規表現の否定

pandasを利用中、下図のようなデータに対してid列の文字列が混ざっている行だけを削除したい場面があった。

id color
1 red
2 orange
3test blue
4 yellow

3行目のidにtestの文字が混ざってしまっている。

contains()で正規表現の否定の記述

これをcontains()でやろうとして少し嵌った。vim上でよくやる[^a-zA-Z]が使えなかったからだ。

df = df[df['id'].str.contains('[^a-zA-Z]', na=False)]
これだとうまくいかない
df = df[~df['id'].str.contains('[a-zA-Z]', na=False)]
これならOK
match()で否定先読み

調べたところ、正規表現を使いたいならmatch()で否定先読みを使うほうがいいかもしれない。

df = df[df['id'].str.match('(?![a-zA-Z])', na=False)]

あと行を除外するためにdrop()でやろうとするとかえって面倒だった。指定したインデックスを削除するものだが、そのインデックスを作成するのが面倒。
指定した条件を除外する。ではなく、指定した除外条件以外を抽出する。と考えたほうが楽。