获取字符串序列的加权值

2024-04-26 22:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

系列如下:

value
aa aa bb cc
dd ee aa
ff aa cc

我想计算一行中某个单词的出现次数,并用字典中给出的权重相乘

weights = {
   'aa':1,
   'bb':1,
   'cc':0.5
}

结果应该是

value_score
3.5
1
1.5

以上可以解释为总和(单词在字典中的出现*字典中的权重),即第一个值是2*1+1*1+1*0.5=3.5

我目前使用str.计数但随着更多的价值观的出现,它并不是有效的

df['value_score'] = (df['value'].str.count('aa', regex=False) * weights['aa'] +
                     df['value'].str.count('bb', regex=False) * weights['bb'] +
                     df['value'].str.count('cc', regex=False) * weights['cc'] )

Tags: falsedf字典valuecount单词ddregex
2条回答

将列表理解与get一起用于0用于不匹配的值:

df['value_score'] = df['value'].apply(lambda x: sum(weights.get(y, 0) for y in x.split()))
print (df)
         value  value_score
0  aa aa bb cc          3.5
1     dd ee aa          1.0
2     ff aa cc          1.5

另一种解决方案:

df['value_score'] = df['value'].str.split(expand=True).stack().map(weights).sum(level=0)
print (df)
         value  value_score
0  aa aa bb cc          3.5
1     dd ee aa          1.0
2     ff aa cc          1.5

您可以使用^{}

from collections import Counter

df['value_score'] = [sum(weights.get(k, 0) * v for k, v in Counter(x.split()).items()) \
                     for x in df['value']]

print(df)

         value  value_score
0  aa aa bb cc          3.5
1     dd ee aa          1.0
2     ff aa cc          1.5

没有矢量化的解决方案是可能的。为了提高性能,您应该支持列表理解而不是Pandasstr方法。你知道吗

相关问题 更多 >