座学録

id:hikaru515 の技術ブログです

Pandasの抽出条件

技術ブログというよりは学んだことを適当にかいてくことにした.

まえがき

Pandas を使っているときによくやる処理として, 「条件を満たす行のみ抽出する」という処理がある.

例えば, 次のようなことだ.

>>> import pandas as pd

>>> df = pd.DataFrame([[1, 1], [2, 2], [3, 1]], columns=['key', 'val'])

>>> df

 key val

0 1 1

1 2 2

2 3 1

>>> df[df['val'] == 1] # val 列が1のところのみ抽出したい

 key val

0 1 1

2 3 1

この抽出について少し解説と, 抽出条件にリストを使いたいときのメソッドがあるので紹介する.

抽出の方法

前提

df はまえがきに書いたものをそのまま使用する.

データフレームと条件式

まず, pd.DataFrame および pd.Series を不等式や条件式にいれると, 各セルごとに真偽が帰ってくる*1. 以下のような感じだ.

>>> df > 2

 key val

0 False False

1 False False

2  True False

>>> df.val > 2

0 False

1 False

2 False

Name: val, dtype: bool

==> >= などでも, 想定通りの挙動をするだろう.

上記の例と, 行の抽出をするときに df[df['key'] == 2] は, df[pd.Series([False, True, False])] という評価が起きていることになる. したがって, 行を抽出する処理というのは Bool 値の pd.SeriesTrue を返している行のみ抽出していることになる. 実際,

>>> df[pd.Series([True, True, False])]

 key val

0 1 1

1 2 2

抽出条件に使えるもの

上記の考察から, 「特定の列が特定の条件を満たした行を抽出する」ためには Bool 値を返す pd.Seriesdf[][] 内に入れればよい.

pd.Series.isin

pd.Series.isin メソッド はリストを引数にとって, Bool 値の Series を返すメソッドである.

>>> df.key.isin([1, 3, 5])

0  True

1 False

2  True

Name: key, dtype: bool

たとえば, 特定の ID をもつ行のみ抽出したければ, df[df['ID'].isin(ids)] (ids は ID のリスト) などとすればよい. ちなみに, 真偽の逆転には ~ (ビット反転) をすればよい.

>>> pd.Series([True, True, False])

0  True

1  True

2 False

dtype: bool

>>> ~pd.Series([True, True, False])

0 False

1 False

2  True

dtype: bool

stackoverflow.com

~*2 pandas 独自の演算子ではなく組み込みの演算子である. 詳細は下記などを参照.

qiita.com

*1:Numpy とかだと, これと int(True) == 1, int(False) == 0 を利用して条件を満たす要素の個数を数える若干技巧的なコードを書いたりする. 便利なので使うが, わかりやすいとは思っていない.

*2:僕もさっき知ったのだが