認爲這將是直接的,但有一些麻煩追蹤優雅的方式來同時搜索數據框中的所有列以進行部分字符串匹配。基本上,我如何將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. 過濾器,在字符串搜索詞
- 2. FreeTextTable過濾器搜索字符串
- 3. 熊貓DataFrame搜索列中可用列表中的所有字符串
- 4. Oracle在字符串中搜索所有表的所有列
- 5. Mysql搜索所有字符串排列
- 6. Angularjs搜索過濾器不會在所有頁面中搜索
- 7. PHP字符串搜索網頁過濾
- 8. PHP - 搜索/過濾由字符串(S)
- 9. Easy UI Treegrid在所有列上都有搜索過濾器
- 10. 在列(Pandas)中過濾字符串/浮點數/整數值
- 11. 在字符串中搜索字符串的所有實例
- 12. 在Python/Pandas DataFrame的列中按字符進行索引
- 13. 搜索所有表中的字符串
- 14. 需要在表中的所有列中搜索字符串
- 15. 搜索過濾器:最少字符數
- 16. 在Pandas DataFrame列中處理多個值字符串
- 17. 重新排列具有混合元組和字符串列的pandas DataFrame列
- 18. Extjs4存儲過濾器 - 在字符串內搜索
- 19. 過濾器在NHibernate的列中搜索
- 20. 在列中搜索所有發生的字符串
- 21. 在數據表的所有列中搜索字符串
- 22. 檢查字符串是否在pandas Dataframe列中,並創建新的Dataframe
- 23. 具有多條件搜索的表單 - 使用字符串和過濾器
- 24. 使用Pandas過濾來自Dataframe兩列的非數字數據
- 25. Python Pandas - 主DataFrame,想要刪除所有列在較小的DataFrame
- 26. 如何將dtype列轉換爲Pandas Dataframe中的字符串
- 27. PHP搜索CSV文件。搜索過濾器最小字符數
- 28. 基於現有列的9個過濾器創建一個Pandas DataFrame列
- 29. 通過字符串搜索
- 30. 通過搜索字符串
你想搜索整個數據幀,而不僅僅是一個特定的列? – EdChum 2014-10-29 20:45:13
'str.contains'方法僅適用於Series,因此您必須執行類似於'df:df [col] .str.contains('^')col的操作' – EdChum 2014-10-29 20:48:03