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

时间:2016-08-16 16:55:46

标签: python pandas

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

例如,给定以下数据框,选择任何列中的值包含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)]。有更简单的解决方案吗?

重要的是,我想检查任何列中的匹配项,而不是特定列。我能说的其他类似问题只能解决一个列或一列列。

2 个答案:

答案 0 :(得分:5)

这个问题没有给出答案..但是问题本身和评论已经得到了答案,这对我来说非常有用......而且我看不到任何答案。< / em>的

所以我只是复制粘贴答案给那些能发现它有用的人。我为case不敏感的serach添加了case = False

来自@Reason的解决方案:

到目前为止,我提出的最好的是相当麻烦的

这个对我有用。

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

来自@rbinnun的解决方案:

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

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

负责非字符串列,nans等。

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

答案 1 :(得分:0)

df.apply 在处理大量(数百万)行时太慢了。寻找其他东西。