potass' blog

ポタシウムのことが書いてないブログ。

PythonでDataFrameのすべての列を検索して特定の文字列を含む行を取得する

PythonでDataFrameのある列を検索して特定の文字列を含む行のmaskはよくありふれていて、すべての列に対して検索したものがなかったので備忘録として残す。

データの準備

import pandas as pd

df = pd.DataFrame([[11, 'red', 'a', 1],
                [22, 'black', 'e', 0],
                [33, 'yellow', 'b', '10']],
                columns=['col1', 'col2', 'col3', 'col4'])
'''
   col1    col2 col3 col4
0    11     red    a    1
1    22   black    e    0
2    33  yellow    b   10
'''

すべての列を検索して特定の文字列を含む行を取得する

# 各index内で文字列'a'が含まれているかのmask。
mask1 = df.apply(lambda row, string='a': True in (row.astype(str).str.contains(string).unique()), axis=1) 
'''
0     True
1     True
2    False
dtype: bool
'''
df[mask1] # これでdfから取り出せる。
'''
   col1   col2 col3 col4
0    11    red    a    1
1    22  black    e    0
'''

ある1列に対して特定の文字列を含む行を取得する

この内容はググればすぐ出てくる。

# col2に'e'が含まれているかのmask。
# この例ではastype(str)は不要だが例えば「col4で0が含まれているか」だと
# col4のdtypeがobject(0と'10'が混じっている)になるので必要になる。
mask2 = df['col2'].astype(str).str.contains('e')
'''
0    False
1     True
2     True
Name: col2, dtype: bool
'''
df[mask2] # これでdfから取り出せる。
'''
   col1    col2 col3 col4
1    22   black    e    0
2    33  yellow    b   10
'''

参考文献

qiita.com