2014-03-14 84 views
0

可以說我有兩個單詞列表,其中有一個單詞跟在另一個單詞後面。他們通過空間或短劃線相連。爲簡單起見,他們將是相同的話:複合詞使用熊貓進行大型數據集檢測

First=['Derp','Foo','Bar','Python','Monte','Snake'] 
Second=['Derp','Foo','Bar','Python','Monte','Snake'] 

所以下面的話以下組合存在(由是表示):

  Derp Foo Bar Python Monte Snake 
Derp  No  No Yes Yes  Yes  Yes 
Foo   Yes  No No  Yes  Yes  Yes 
Bar   Yes  Yes No  Yes  Yes  Yes 
Python  No  Yes Yes No  Yes  Yes 
Monte  No  Yes Yes No  No  No 
Snake  Yes  No Yes Yes  Yes  No 

我已經設置這樣的,我是一個數據檢測特定的詞:

df=pd.DataFrame({'Name': [ 'Al Gore', 'Foo-Bar', 'Monte-Python', 'Python Snake', 'Python Anaconda', 'Python-Pandas', 'Derp Bar', 'Derp Python', 'JavaScript', 'Python Monte'], 
       'Class': ['Politician','L','H','L','L','H', 'H','L','L','Circus']}) 

如果我使用正則表達式,並標記所有從模式的數據會是這個樣子:

import pandas as pd 


df=pd.DataFrame({'Name': [ 'Al Gore', 'Foo-Bar', 'Monte-Python', 'Python Snake', 'Python Anaconda', 'Python-Pandas', 'Derp Bar', 'Derp Python', 'JavaScript', 'Python Monte'], 
       'Class': ['Politician','L','H','L','L','H', 'H','L','L','Circus']}) 
df['status']='' 

patterns=['^Derp(-|\s)(Foo|Bar|Snake)$', '^Foo(-|\s)(Bar|Python|Monte)$', '^Python(-|\s)(Derp|Foo|Bar|Snake)', '^Monte(-|\s)(Derp|Foo|Bar|Python|Snake)$'] 


for i in range(len(patterns)): 
    df.loc[df.Name.str.contains(patterns[i]),'status'] = 'Found' 

print (df) 

這裏是打印:

>>> 

     Class    Name status 
0 Politician   Al Gore  
1   L   Foo-Bar Found 
2   H  Monte-Python Found 
3   L  Python Snake Found 
4   L Python Anaconda  
5   H Python-Pandas  
6   H   Derp Bar Found 
7   L  Derp Python  
8   L  JavaScript  
9  Circus  Python Monte  

[10 rows x 3 columns] 

對於更大的數據集似乎並不非常可行寫出所有的正則表達式模式。那麼有沒有辦法讓一個循環或某些東西通過組合矩陣中的模式來檢索存在的模式(在上表中表示爲yes)並跳過那些不存在的模式(在上表中表示爲否)?我知道在itertools庫中有一個叫做combinations的函數,它可以通過循環來生成所有可能的模式。

回答

1

我不認爲這太難了,從你有組合矩陣生成的正則表達式:

# Reading in your combination matrix: 
pattern_mat = pd.read_clipboard() 
# Map from first words to following words: 
w2_dict = {} 
for w1, row in pattern_mat.iterrows(): 
    w2_dict[w1] = list(row.loc[row == 'Yes'].index) 
# Print all the resulting regexes: 
# (not sure if the backspace needs to be escaped?) 
for w1, w2_list in w2_dict.items(): 
    pattern = "^{w1}(-|\s)({w2s})$".format(w1=w1, w2s='|'.join(w2_list)) 
    print(pattern) 

輸出:

^Monte(-|\s)(Foo|Bar)$ 
^Snake(-|\s)(Derp|Bar|Python|Monte)$ 
^Bar(-|\s)(Derp|Foo|Python|Monte|Snake)$ 
^Foo(-|\s)(Derp|Python|Monte|Snake)$ 
^Python(-|\s)(Foo|Bar|Monte|Snake)$ 
^Derp(-|\s)(Bar|Python|Monte|Snake)$ 
+0

感謝您的答覆,以便爲這是你基本上做了:存儲表格做一個字典,循環訪問表中的是的值,並將其存儲在字典中,並使用行作爲鍵。然後使用連接生成模式。 – ccsv

+0

@ccsv是的,基本上就是這樣。可能有比使用'iterrows'更優雅的方法來通過模式矩陣,但除此之外,我認爲它非常簡單,您只需要將一些更多的xomplcex單行語句擴展爲多行以提高可讀性。 – Marius