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

时间:2015-12-18 11:16:04

标签: python search pandas dataframe contains

我有一个数据框,我希望通过逐个检查所有行中所有列中是否存在关键字来获取子集。 这是片段:

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

但是因为并非所有列值都是字符串类型,所以它会引发错误:

  

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

在这里没有示例的飞行盲人,但是怎么样:

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)

答案 1 :(得分:2)

没有数据它很复杂,但我尝试使用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 :(得分:0)

按如下方式循环遍历数据框列将为您提供包含目标值的列表。

str_cols = []
for c in df:
    try:
        if df[c].apply(lambda x: x.str.contains('TEST')).any()
        str_cols.append(c)
    except:
        pass