Pandas。让函数映射部分Dict匹配[英] Pandas: Make function map partial Dict match

本文是小编为大家收集整理的关于Pandas。让函数映射部分Dict匹配的处理方法,想解了Pandas。让函数映射部分Dict匹配的问题怎么解决?Pandas。让函数映射部分Dict匹配问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

此函数查看 pandas 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

问题:

我怎样才能让它接受 部分 匹配,并替换匹配的单词,同时保持字符串的其余部分完好无损?现在它只接受 literal 匹配.

目标:

字符串是"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" 列仍处于其原始状态以供将来使用.

推荐答案

我想这可能就是你要找的.

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,然后返回替换匹配单词的原始字符串.

本文地址:https://www.itbaoku.cn/post/1727753.html