[Python]pandasの複数カテゴリーを一括抽出

[Python]pandasの複数カテゴリーを一括抽出
pandasで特定のカテゴリーに該当するデータを抽出することはよくあります。それが複数条件の場合も少なくありません。今回は、カテゴリーデータを複数条件で抽出する方法になります。
In [1]:
import pandas as pd
import numpy as np
In [2]:
df = pd.DataFrame({'ID':[1,2,3,4],
              'segment':list('ABCD'),
              'x':np.random.normal(size=4)})
df
Out[2]:
ID segment x
0 1 A -0.240695
1 2 B -0.093846
2 3 C -0.694149
3 4 D 0.576705

セグメントAとBのデータを抽出する際は以下のように書いてあるかと思います。

条件抽出

In [3]:
df.loc[(df['segment']=='A') | (df['segment']=='D')]
Out[3]:
ID segment x
0 1 A -0.240695
3 4 D 0.576705

2つぐらいの条件なら別に苦ではないですが、6個とかになってくると一気に憂鬱になります。。。そんなときはstr.containsを使います。

In [4]:
df = pd.DataFrame({'ID':[1,2,3,4,5,6,7,8,9,10],
              'segment':list('ABCDEFGHIJ'),
              'x':np.random.normal(size=10)})
df
Out[4]:
ID segment x
0 1 A -1.398411
1 2 B 0.358886
2 3 C -0.385779
3 4 D 0.793989
4 5 E 0.566318
5 6 F 0.922877
6 7 G -1.213143
7 8 H 0.089538
8 9 I -1.605849
9 10 J 0.193814

containsを使って複数条件を一括抽出

In [5]:
df.loc[df['segment'].str.contains('A|C|D|E|G|J')]
Out[5]:
ID segment x
0 1 A -1.398411
2 3 C -0.385779
6 7 G -1.213143
9 10 J 0.193814

何回も条件式を書くぐらいなら、こちらのほうが便利ですよね。ちなみに含まないものを指定するときは以下のように記述します。

In [6]:
df.loc[~df['segment'].str.contains('A|C|D|E|G|J',na = False)]
Out[6]:
ID segment x
1 2 B 0.358886
3 4 D 0.793989
4 5 E 0.566318
5 6 F 0.922877
7 8 H 0.089538
8 9 I -1.605849

今回はnaはないですが、naオプションは常につけておくほうが無難です。

まとめ

文字列での抽出を行う際では、条件式を一つ一つ書いていくよりstr.containsを使ったほうがわかりやすく、コードを書く負荷も少ないです。応用すれば、カラムの抽出などにも使えます。でわでわ、今日もこのへんで。

 

Pythonカテゴリの最新記事