我知道在一个列(here)中有一个有关搜索字符串的相关主题,但是如何在所有列中使用pd.Series.str.contains(pattern)?
df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball'],
'id2': [u'uball', u'mball', u'pnut', u'zball']})
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
答案 0 :(得分:5)
仅将select_dtypes
和applymap
和in
用于对象列(显然是字符串):
df = pd.DataFrame({'vals': [1, 2, 3, 4],
'ids': [None, u'bball', u'cnut', u'fball'],
'id2': [u'uball', u'mball', u'pnut', u'zball']})
print (df)
vals ids id2
0 1 None uball
1 2 bball mball
2 3 cnut pnut
3 4 fball zball
mask = df.select_dtypes(include=[object]).applymap(lambda x: 'ball' in x if pd.notnull(x) else False)
#if always non NaNs, no Nones
#mask = df.select_dtypes(include=[object]).applymap(lambda x: 'ball' in x)
print (mask)
ids id2
0 False True
1 True True
2 False False
3 True True
mask = df.select_dtypes(include=[object]).apply(lambda x: x.str.contains('ball', na=False))
#if always non NaNs, no Nones
#mask = df.select_dtypes(include=[object]).apply(lambda x: x.str.contains('ball'))
print (mask)
ids id2
0 False True
1 True True
2 False False
3 True True
然后使用DataFrame.any
检查每行至少一个True
或DataFrame.all
检查每行的所有值进行过滤:
df1 = df[mask.any(axis=1)]
print (df1)
vals ids id2
0 1 None uball
1 2 bball mball
3 4 fball zball
df2 = df[mask.all(axis=1)]
print (df2)
vals ids id2
1 2 bball mball
3 4 fball zball
答案 1 :(得分:5)
stack
如果仅选择可能具有'ball'
且属于dtype
object
的列的对象,则可以将stack
生成的数据框放入一系列对象中。此时,您可以将结果pandas.Series.str.contains
和unstack
执行回数据框。
df.select_dtypes(include=[object]).stack().str.contains('ball').unstack()
ids id2
0 True True
1 True True
2 False False
3 True True