2015-08-24 72 views
1

該函數查看熊貓的字符串DataFrame。如果字符串包含與字典中的條目相匹配的正則表達式,則會將捕獲的字符串傳遞給函數的其他部分,最後返回statement熊貓:製作功能地圖部分字典匹配

def f(value): 
    f1 = lambda x: dictionary[regex.findall(x)[0]] if regex.findall(x)[0] in dictionary else "" 
    match = f1(value) 
    #Do stuff 
    return statement 

問題

我怎樣才能使它接受部分匹配,更換匹配的單詞,同時保持字符串的其餘部分完好?現在它只接受文字比賽。

目標

的字符串是"BULL GOOGLE X3 VON"。我希望字典中的{"GOOG":足以將單詞轉換爲:"Google"}。轉換後的字符串將是"BULL Google X3 VON",並且該函數將通過"Google"

注:我想繼續使用dict作爲實現,因爲程序的其他部分依賴於它。

代碼:

#DataFrame 
df = pd.DataFrame(["BULL GOOGLE X3 VON", "BEAR TWITTER 12X S"], columns=["Name"]) 

#Dict 
google = {"GOOG":"Google"} 
twitter = {"TWITT":"Twitter"} 
dictionary = goog.copy() 
dictionary.update(twitter) 

#Regex 
regex = re.compile(r"\s(\S+)\s", flags=re.IGNORECASE) 

#Function 
def f(value): 
    f1 = lambda x: dictionary[regex.findall(x)[0]] if regex.findall(x)[0] in dictionary else "" 
    match = f1(value) 
    #Do stuff 
    return statement 

#Map Function 
df["Statement"] = df["Name"].map(lambda x:f(x)) 

思路

如果可以直接修改函數接受部分匹配,那將是一件好事。

否則,一個解決方案可能是首先replace字符串中的匹配字 - 保持字符串的其餘部分不變 - 然後將正則表達式子字符串與字典匹配。這些步驟可能發生在臨時列中,因此列"Name"仍處於其原始狀態以備將來使用。

+0

你不能只用'contains'嗎? – JohnE

回答

2

我認爲這可能是你正在尋找的。

df = pd.DataFrame(["BULL GOOGLE X3 VON", "BEAR TWITTER 12X S"], columns ["Name"]) 

#Dict 
google = {"GOOG":"Google"} 
twitter = {"TWITT":"Twitter"} 
dictionary = google.copy() 
dictionary.update(twitter) 

#Regex 
regex = re.compile(r"\b((%s)\S*)\b" %"|".join(dictionary.keys()), re.I) 

def dictionary_lookup(match): 
    return dictionary[match.group(2)] 

#Function 
def f(value): 
    match = dictionary[regex.search(value).group(2)] 
    #Do stuff 
    statement = regex.sub(dictionary_lookup, value) 
    return statement 

#Map Function 
df["Statement"] = df["Name"].map(lambda x:f(x)) 

這將匹配以在字典中的關鍵之一開頭的字,從詞典中匹配的值賦給變量match,然後用匹配的詞替換返回原始的字符串。

+0

高興地說,這完美的作品。謝謝! – Winterflags