我有一个数据框,我希望通过逐个检查所有行中所有列中是否存在关键字来获取子集。 这是片段:
df.apply(lambda x: x.str.contains('TEST')).any()
但是因为并非所有列值都是字符串类型,所以它会引发错误:
AttributeError:('只能使用带字符串值的.str访问器
感谢任何帮助。
答案 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