用通讯员姓名映射字符

问题描述

我有以下数据框:

strings.   intention
g          google
go         google
yo         youtube
y          youtube
a          amazon
am         amazon
skys       skype

我想做的是用字符串映射字符,所以如果我在第一行有“g”并且意图是谷歌那么它匹配但是,最后一行是“天空”和意图是skype,第4个字符不匹配,则为false。

我正在寻找的最终结果是:

strings.   intention       match
    g          google      TRUE
    go         google      TRUE
    yo         youtube     TRUE
    y          youtube     TRUE
    a          amazon      TRUE
    am         amazon      TRUE
    skys       skype       FALSE

到目前为止我尝试的是这个,它有效但不完全,因为有一些例子我有字符串“ne”并且它应该显示netflix但它显示例如“nykaa”。有没有更好的方法来做到这一点?

keywords = dict(zip(df.string,df['intent_pretty_name']))
df['match'] = [next((keywords[y] for y in x.split() if y in keywords),None) for x in df['strings']]

谢谢

解决方法

您可以使用简单的 string.startswith

进行比较
#for corresponding string and intention
match = intention.startswith(string) #returns true or false

参考:

,

如果您不介意 apply(在大型数据集上可能会很慢),您可以这样做 startswith

df['match'] = df.apply(lambda s: s['intention'].startswith(s['strings']),axis=1)

df
Out[139]: 
  strings intention  match
0       g    google   True
1      go    google   True
2      yo   youtube   True
3       y   youtube   True
4       a    amazon   True
5      am    amazon   True
6    skys     skype  False
,

对于矢量化解决方案,您可以将 pd.Series.replace(...)regex=True 结合使用:

df["match"] = df["intention"].replace(df["strings"]+".*","True",regex=True).eq("True")

输出:

  strings intention  match
0       g    google   True
1      go    google   True
2      yo   youtube   True
3       y   youtube   True
4       a    amazon   True
5      am    amazon   True
6    skys     skype  False