2017-09-13 66 views
0

使用熊貓,我正在採取一個大的CSV文件,並且只想要包含某些確切字符串的行。我有這個工作,但覺得應該有一個更好的方法,因爲它是非常緩慢和難以維持搜索模式,因爲我添加更多的條款進行搜索。以下是代碼片段:熊貓字符串搜索 - 多個確切值 - 非常慢

regex_search = '(?:\,|^)EXACT PATTERN 1(?:\,|$)|(?:\,|^)EXACT PATTERN 2(?:\,|$)' 
results = df[df['Column_to_search'].str.contains(regex_search)] 
#now spit out all the rows where the column had the matched value in new CSV file 

我使用正則表達式基本上說:

(?:\,|^) --> pattern must be preceded by a comma 
(?:\,|$) --> pattern must be followed by a comma 
|   --> OR ,so that I can match as many search terms as needed 
#... 
#df is just the data frame that was loaded via pandas 

該列表會導致很多問題進行維修!我必須通過一個循環來添加正則表達式字符串,然後必須根據需要對任何新短語進行格式化。

本來,我有搜索詞爲:

regex_search = 'EXACT PATTERN 1|EXACT PATTERN 2' 

這是易於維護,但因爲它是正則表達式它也將匹配一噸的誤報,尤其是對於較小的短語或縮寫這會導致問題。

regex_search變量通常有300多個詞組可供搜索,而csv文件有數千行。有沒有一個Python函數來做到這一點?也許是這樣的:

.str.match_multiple() 
#or 
regex_search_list = ['ABC','XYZ','ETC'] 
.str.match_in_list(regex_search_list) 

我不認爲我可以使用.match,因爲我的正則表達式字符串有多個值。如果熊貓根據列表匹配列值,我還沒有找到它。

想法?有一個更好的方法嗎?

+1

你是問,如果熊貓能爲值的列表,搜索欄? 'df [df.column_name.isin(list_of_values)]'它必須完全匹配。 –

+0

從我測試的內容來看,'str'訪問器並不比在Python中使用for循環快。這可能會給你一個小小的加速。然後我會建議查看[cython](http://cython.org/)。 –

+0

這個基於交替的正則表達式的問題是每個備選方案都在相同的位置匹配。使用'(?:,| ^)(?:patt1 | patt2 | pattN)(?:,| $)'。另外,可以使用'(?<![^,])'和'(?![^,])'(不確定它是否更快)來開始和結束交替。然後,你可以使用[trie建立一個有效的正則表達式。](https://stackoverflow.com/a/42789508/3832970) –

回答

0

感謝評論中的A.Kot,我使用了.isin(),它將我的腳本從20分鐘縮短到了大約10秒。

新代碼:

list_search = ['EXACT PATTERN 1', 'EXACT PATTERN 2'] 
results = df[df['Column_to_search'].isin(list_search)]