在任何列中搜索关键字的数据框并获取行

Posted

技术标签:

【中文标题】在任何列中搜索关键字的数据框并获取行【英文标题】:search dataframe for a keyword in any column and get the rows 【发布时间】:2016-03-25 02:09:57 【问题描述】:

我有一个数据框,我希望通过一一检查所有行的所有列中是否存在关键字来获得一个子集。 这是sn-p:

df.apply(lambda x: x.str.contains('TEST')).any()

但是因为不是所有的列值都是字符串类型,所以它会抛出错误:

AttributeError:('只能使用带有字符串值的.str访问器

感谢任何帮助。

【问题讨论】:

可以加Minimal, Complete, and Verifiable example吗? 【参考方案1】:

没有数据很复杂,但我尝试使用 numpy 函数numpy.column_stack 和列表理解:

print df
       A      B          D   E
0      A  TEST1 2014-04-08   8
1      B  TEST2 2014-05-08   7
2      B      C 2014-05-08  15
3      B  TEST3 2014-05-08   1
4  TESTA      A 2014-04-08   6
5      A  TEST5 2014-04-08   1

用带有字符串数据的列掩码子集

 mask = np.column_stack([df[col].str.contains("TEST") for col in ['A', 'B']])
 print mask
 [[False  True]
 [False  True]
 [False False]
 [False  True]
 [ True False]
 [False  True]]
print df.loc[mask.any(axis=1)]
       A      B          D  E
0      A  TEST1 2014-04-08  8
1      B  TEST2 2014-05-08  7
3      B  TEST3 2014-05-08  1
4  TESTA      A 2014-04-08  6
5      A  TEST5 2014-04-08  1

使用非字符串数据排除列的掩码子集

mask = np.column_stack([df[col].str.contains("TEST") for col in df if col not in ['D', 'E']])
print mask
[[False  True]
 [False  True]
 [False False]
 [False  True]
 [ True False]
 [False  True]]
print df.loc[mask.any(axis=1)]
       A      B          D  E
0      A  TEST1 2014-04-08  8
1      B  TEST2 2014-05-08  7
3      B  TEST3 2014-05-08  1
4  TESTA      A 2014-04-08  6
5      A  TEST5 2014-04-08  1

【讨论】:

【参考方案2】:

这里没有示例,但如何:

df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)

所以,例如:

import numpy as np
import pandas as pd

np.random.seed(0)
df = pd.DataFrame(np.random.choice(['0.0', 'Hello', 'Goodbye'], (12, 3)))
df.apply(lambda row: row.astype(str).str.contains('Hello').any(), axis=1)

【讨论】:

以上是关于在任何列中搜索关键字的数据框并获取行的主要内容,如果未能解决你的问题,请参考以下文章

从列表中搜索数据框以及在 Scala 的新列中找到的所有元素

MySQL返回列包含任何但仅包含一组关键字的所有行

在DAX中搜索关键字

通过正则表达式提取excel特定列中含有关键字的所有行数据

在多表列中具有多个术语的简单 PHP 过滤器

Emacs Helm: 使用关键字搜索获取执行任何东西