在任何列中搜索关键字的数据框并获取行
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)
【讨论】:
以上是关于在任何列中搜索关键字的数据框并获取行的主要内容,如果未能解决你的问题,请参考以下文章