2017-07-11 25 views
2

我想知道什麼是最好的和有效的方式來檢查是否滿足4條標準中的3條滿足熊貓過濾條件。最好的方法來過濾多個條件?

目標字:Stevenson

數據幀:

+-----------+ 
| Names | 
+-----------+ 
| Smith  | 
| Stevens | 
| Parker | 
| Stevenson | 
| Dickson | 
| Greene | 
+-----------+ 

我需要過濾該DF以包括具有至少3個選自4 bigrams = ["st", "te", "ev", "on"]字。我需要它包括文字StevensStevenson。然後我計算我的目標詞和過濾詞之間的相似度。

我現在要做的是創建3個4的所有組合[(st, te, ev), (st, ev, on), ....],並使用df.Names.str.contains("st") & df.Names.str.contains("ev")等篩選我的數據幀。然後我只留下唯一的行。

我覺得這並不是最有效的方法,因爲我在過濾上浪費大部分時間,而不是模糊匹配(正如我所預料的那樣)。我正在測試大小爲100k的df,但我真正的df超過了1M行。任何想法如何做得更好?二元搜索不適用於我的真實示例。

+1

它看起來像布爾索引是你在找什麼。它會更有效率。 (http://pandas-docs.github.io/pandas-docs-travis/#boolean-indexing) – brotherperes

+1

我不確定它是否更有效但可以測試'df [sum([df ['Names'] .str.contains(pat)for pat in bigrams])> = 3]'? – ayhan

+1

我認爲阿揚提出了一個很好的解決方案。我想補充的唯一想法是apply + in的組合可以比pandas str.contains更快(在我用大約1m行的情況下,速度是兩倍) –

回答

2

這應該工作。 (經過幾次編輯)

bigrams = ["st", "te", "ev", "on"] 
df['count'] = df.Names.apply(lambda x: sum([1 for v in bigrams if v in x])) 
df[df['count'] >= 3].Names 
+0

在'df = DataFrame({'Names':['stevens','smith','parker','john','greene','dickson','harsh','steven','stack ']})' – ksai

+0

是的,我沒有做任何分析。 – Adam

+0

我要試一試,並會回報。看起來好多了(比我更清潔)。 – pawelty

1

使用pandas.Series.apply,如果datatype名稱str

df[df['Names'].apply(lambda x : ('st' in x) & ('ev' in x))]