【问题标题】:Most concise way to select rows where any column contains a string in Pandas dataframe?在 Pandas 数据框中选择任何列包含字符串的行的最简洁方法?
【发布时间】:2016-12-23 03:50:29
【问题描述】:

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

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

df = pd.DataFrame({
    'x': ['foo', 'foo', 'bar'],
    'y': ['foo', 'foo', 'foo'],
    'z': ['foo', 'baz', 'foo']
})

我对 Pandas 没有经验,到目前为止我想出的最好的方法是相当麻烦的 df[df.apply(lambda r: r.str.contains('b').any(), axis=1)]。有没有更简单的解决方案?

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

【问题讨论】:

  • .str.contains 是在 pd.Series 上定义的一种方法,因此您似乎需要以一种或另一种方式使用 apply 或某种循环。可能会有一些黑客用 NaN 替换 b 并基于此删除,但您的方式似乎更清晰。
  • 您也可以这样做 df[df.sum(axis=1).str.contains('b')] 但我不认为这种行为是可靠的。我也不认为这是重复的。
  • df[df.apply(lambda row: row.astype(str).str.contains('b').any(), axis=1)] 负责处理非字符串列、nans 等。

标签: python pandas


【解决方案1】:

这个问题没有给出答案.. 但问题本身和 cmets 已经得到了答案,这对我来说非常有效.. 我在其他任何地方都找不到答案。

所以我只是将答案复制粘贴给那些觉得它有用的人。我为不区分大小写的搜索添加了 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)

【讨论】:

  • 如果您使用的是 Python 2,第二个将尝试将该列转换为 ASCII 字符串,因此会出现 unicode 错误。改为unicodedf[df.apply(lambda row: row.astype(unicode).str.contains('b', case=False).any(), axis=1)]
  • 这个解决方案超级慢!
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2016-07-15
  • 2018-02-25
  • 2019-12-02
  • 1970-01-01
相关资源
最近更新 更多