认为这将是直接的,但有一些麻烦追踪优雅的方式来同时搜索数据框中的所有列以进行部分字符串匹配。基本上,我如何将df['col1'].str.contains('^')
一次应用于整个数据帧,并过滤到包含匹配记录的任何行?在所有Pandas DataFrame列和过滤器中搜索字符串
回答
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
运算符;但是(通常)使用正则表达式会更快。
嘿@unutbu,您的问题。为什么在使用'pd.DataFrame(...)。转置()'时使用'np.column_stack'? – propjk007 2015-12-01 17:42:37
当'mask'是一个布尔型的NumPy数组时,'df.loc [mask]' 选择了'mask'为True的行。然而,如果'mask'是一个DataFrame,那么'df.loc [mask]'从'df'中选择那些* index *值与 'mask'中的索引值相匹配的行,它对应于一个True值。当你需要时,这种索引的对齐方式非常棒,但是当你不需要时,会降低性能。因此,简而言之,如果您不需要索引 ,请使用NumPy数组而不是DataFrame。另外,创建 DataFrame比创建NumPy数组慢得多,所以 在这里使用'pd.DataFrame([...])。T'没有任何优势。 – unutbu 2015-12-01 18:52:51
我没有想到DataFrame方法的性能影响。或多或少,增加另一个Module(numpy),并认为使用同一个库(熊猫)中的函数会更好。我明白你的方法在长远来看是更好的。谢谢@unutbu! – propjk007 2015-12-01 22:02:03
尝试:
df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)
- 1. FreeTextTable过滤器搜索字符串
- 2. Mysql搜索所有字符串排列
- 3. Angularjs搜索过滤器不会在所有页面中搜索
- 4. PHP字符串搜索网页过滤
- 5. Easy UI Treegrid在所有列上都有搜索过滤器
- 6. 在字符串中搜索字符串的所有实例
- 7. 在列(Pandas)中过滤字符串/浮点数/整数值
- 8. 搜索所有表中的字符串
- 9. 需要在表中的所有列中搜索字符串
- 10. 在Python/Pandas DataFrame的列中按字符进行索引
- 11. Extjs4存储过滤器 - 在字符串内搜索
- 12. 重新排列具有混合元组和字符串列的pandas DataFrame列
- 13. 检查字符串是否在pandas Dataframe列中,并创建新的Dataframe
- 14. Python Pandas - 主DataFrame,想要删除所有列在较小的DataFrame
- 15. 基于现有列的9个过滤器创建一个Pandas DataFrame列
- 16. 通过搜索字符串
- 17. 保存和检索搜索过滤器
- 18. 在数据库的所有表格,行和列中搜索字符串
- 19. 在服务器过滤中获取kendo多选中的搜索字符串
- 20. 过滤掉字符串列
- 21. hw搜索索引字符串列表中的子字符串?
- 22. 在列表中搜索字符串; C#
- 23. 列表中存在搜索字符串
- 24. 在列表中搜索字符串
- 25. SQLite fts3:在列中搜索字符串
- 26. 从pandas DataFrame创建一列bools,其中True表示列中存在字符串
- 27. 字符串上的过滤器火花DataFrame包含
- 28. 如何在所有字段中搜索int或字符串
- 29. Python:通过Pandas DataFrame循环以匹配列表中的字符串
- 30. 在Python中过滤字符串列表
你想搜索整个数据帧,而不仅仅是一个特定的列? – EdChum 2014-10-29 20:45:13
'str.contains'方法仅适用于Series,因此您必须执行类似于'df:df [col] .str.contains('^')col的操作' – EdChum 2014-10-29 20:48:03