Pandas:如果关键字出现在任何列中,则选择行

2024-06-29 00:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道有一个关于在一列(here)中搜索字符串的相关线程,但是如何使用pd系列结构。是否包含所有列中的(模式)?在

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

Tags: 字符串idsdataframedfhere模式线程结构
2条回答

仅将^{}用于带有^{}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

另一种解决方案是使用^{}^{}

^{pr2}$

然后,对于筛选,使用^{}检查每行至少一个True,或使用^{}检查每行的所有值:

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

stack

如果只选择可能具有'ball'的内容,这些内容是dtypeobject的列,那么您可以stack将生成的数据帧stack。此时,您可以执行pandas.Series.str.containsunstack将结果返回到数据帧中。在

df.select_dtypes(include=[object]).stack().str.contains('ball').unstack()

     ids    id2
0   True   True
1   True   True
2  False  False
3   True   True

相关问题 更多 >