2015-10-18 96 views
3

我有一個DataFrame(我將其稱爲test)與包含文件路徑的列,我想用部分路徑過濾數據。大熊貓str.contains部分字符串的完全匹配

       full_path 
0 C:\data\Data Files\BER\figure1.png 
1 C:\data\Data Files\BER\figure2.png 
2 C:\data\Previous\Error\summary.png 
3  C:\data\Data Files\Val\1x2.png 
4  C:\data\Data Files\Val\2x2.png 
5   C:\data\Microscopy\defect.png 

的部分路徑發現是:

ex = 'C:\\data\\Microscopy' 

我試過str.contains但是,

test.full_path.str.contains(ex) 

0 False 
1 False 
2 False 
3 False 
4 False 
5 False 

我本來期望的True index的值5.起初我認爲問題可能與路徑字符串由於與轉義字符的差異而不實際匹配,但是:

ex in test.full_path.iloc[5] 

等於True。經過一番挖掘,我認爲str.contains的參數應該是一個正則表達式,所以也許部分路徑中的「\」會混淆事物呢?

我也試過:

test.full_path.apply(lambda x: ex in x) 

但是這給NameError: name 'ex' is not defined。這些數據框可能有很多行,所以我也擔心apply函數可能效率不高。

關於如何搜索DataFrame列的任何建議確切部分字符串匹配?

謝謝!

回答

1

你可以通過regex=False避免str.contains在參數的解釋困惑:

>>> df.full_path.str.contains(ex) 
0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
Name: full_path, dtype: bool 
>>> df.full_path.str.contains(ex, regex=False) 
0 False 
1 False 
2 False 
3 False 
4 False 
5  True 
Name: full_path, dtype: bool 

(旁白:你lambda x: ex in x應該有工作的NameError的是,你還沒有對一些定義ex標誌理由。)

+0

謝謝帝斯曼!我應該在文檔中發現這一點。 (我也認爲lambda表達式應該已經工作了,''ex''在代碼中是明確定義的......也許這與我在使用python調試器的''set_trace''上試過的事實有關)。 – endangeredoxen