在所有Pandas DataFrame列中搜索字符串并过滤

时间:2014-10-29 20:33:20

标签: python pandas

认为这将是直截了当的,但在追踪优雅的方式同时搜索数据框中的所有列以进行部分字符串匹配时遇到了一些麻烦。基本上我如何一次将df['col1'].str.contains('^')应用于整个数据框并过滤到包含匹配记录的任何行?

5 个答案:

答案 0 :(得分:28)

Series.str.contains方法需要正则表达式模式(默认情况下),而不是文字字符串。因此str.contains("^")匹配任何字符串的开头。由于每个字符串都有一个开头,所以一切都匹而是使用str.contains("\^")来匹配文字^字符。

要检查每一列,您可以使用for col in df遍历列名称,然后在每列上调用str.contains

mask = np.column_stack([df[col].str.contains(r"\^", na=False) for col in df])
df.loc[mask.any(axis=1)]

或者,您可以将regex=False传递给str.contains,以使测试使用Python in运算符;但(一般情况下)使用正则表达式更快。<​​/ p>

答案 1 :(得分:11)

尝试:

df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)

答案 2 :(得分:1)

这是一个解决在数据框df的所有列中进行文本搜索的问题的功能:

def search(regex: str, df, case=False):
    """Search all the text columns of `df`, return rows with any matches."""
    textlikes = df.select_dtypes(include=[object, "string"])
    return df[
        textlikes.apply(
            lambda column: column.str.contains(regex, regex=True, case=case, na=False)
        ).any(axis=1)
    ]

它与现有答案的不同之处在于,它既保留在熊猫API中,又拥抱熊猫在列处理方面比行处理更为有效。另外,它被包装为纯函数:-)

相关文档:

答案 3 :(得分:0)

发布我的发现,以防万一。

我有一个数据框(360 000行),需要搜索整个数据框以查找包含单词“ TOTAL”(所有变体,例如“ TOTAL PRICE”,“ TOTAL STEMS”等)的行(仅几行)并删除这些行。

我最终分两步处理了数据框:

查找包含该单词的列:

for i in df.columns:
df[i].astype('str').apply(lambda x: print(df[i].name) if x.startswith('TOTAL') else 'pass')

删除行:

df[df['LENGTH/ CMS'].str.contains('TOTAL') != True]

答案 4 :(得分:0)

这是一个使用 applymap 的例子。我发现其他答案对我不起作用,因为他们假设列中的所有数据都是导致属性错误的字符串。速度也出奇的快。

def search(dataFrame, item):
  mask = (dataFrame.applymap(lambda x: isinstance(x, str) and item in x)).any(1)
  return dataFrame[mask]

如果需要,您可以轻松地将 lambda 更改为使用正则表达式。