Python 选择数据框中任何列包含字符串的行的最简洁方法?

Python 选择数据框中任何列包含字符串的行的最简洁方法?,python,pandas,Python,Pandas,选择数据框中任何列包含字符串的所有行的最简洁方法是什么 例如,给定以下数据帧,选择任何列中的值包含ab的行的最佳方法是什么 df = pd.DataFrame({ 'x': ['foo', 'foo', 'bar'], 'y': ['foo', 'foo', 'foo'], 'z': ['foo', 'baz', 'foo'] }) 我对熊猫没有经验,到目前为止,我想到的最好的方法是相当麻烦的df[df.apply(lambda r:r.str.contains('b'

选择数据框中任何列包含字符串的所有行的最简洁方法是什么

例如,给定以下数据帧,选择任何列中的值包含a
b
的行的最佳方法是什么

df = pd.DataFrame({
    'x': ['foo', 'foo', 'bar'],
    'y': ['foo', 'foo', 'foo'],
    'z': ['foo', 'baz', 'foo']
})
我对熊猫没有经验,到目前为止,我想到的最好的方法是相当麻烦的
df[df.apply(lambda r:r.str.contains('b').any(),axis=1)]
。有更简单的解决方案吗

关键是,我想检查任何列中的匹配项,而不是特定列中的匹配项。其他类似的问题,正如我所能说的,只针对一个或一列列

这个问题没有得到回答。。但是问题本身和评论已经得到了答案,这对我来说非常有效。。我在其他地方都找不到答案

所以我只是把答案复制粘贴给那些觉得有用的人。对于不区分大小写的serach,我添加了case=False

来自@Reason:

到目前为止,我想到的最好的方法是相当麻烦的

这个对我有用

来自@rbinnun的解决方案:

这个对我来说是一个测试数据集。。但是对于一些真实的数据集。。它返回了一个unicode错误,如下所示,但我认为这也是一个很好的解决方案

df[df.apply(lambda row:row.astype(str).str.contains('b',case=False).any(),axis=1)]

处理非字符串列、NAN等

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 5: ordinal not in range(128)

df.apply
处理大量(数百万)行时速度太慢。寻找其他方法。

.str.contains
是在pd.Series上定义的一种方法,因此您似乎需要以某种方式使用apply或某种循环。可能会有一些黑客将b替换为NaN并基于此删除,但您的方法似乎更清晰。您也可以执行
df[df.sum(axis=1).str.contains('b')]
,但我认为这种行为不可靠。我也不认为这是重复的。
df[df.apply(lambda row:row.astype(str).str.contains('b').any(),axis=1)]
处理非字符串列、NaN等。如果使用Python 2,第二个将尝试将列强制转换为ASCII字符串,因此出现unicode错误。转换为
unicode
df[df.apply(lambda行:row.astype(unicode).str.contains('b',case=False).any(),axis=1)]
UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 5: ordinal not in range(128)