在所有Pandas DataFrame列中搜索字符串并过滤
我原以为这件事很简单,但在寻找一种优雅的方法来同时搜索数据表中所有列的部分字符串匹配时遇到了一些麻烦。简单来说,我想知道如何将 df['col1'].str.contains('^')
应用到整个数据表上,并筛选出所有包含匹配内容的行。
8 个回答
3
我把我的发现分享出来,以防有人需要。
我有一个数据表(有36万行),需要在整个数据表中查找包含“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]
9
这里有一个函数,可以用来在数据框 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)
]
这个方法和其他已有的答案不同,它依然使用 pandas 的 API,并且充分利用了 pandas 在处理列时比处理行更高效的特点。而且,这个函数是一个纯函数,简单易用 :-)
相关文档:
50
试试这个:
df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)
88
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)]
另外,你也可以给 str.contains
传递 regex=False
,这样就会用 Python 的 in
操作符来进行测试;不过一般来说,使用正则表达式会更快。