系列如下:
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
以上可以解释为sum(字典中单词的出现*字典中的权重),即第一个值是2 * 1 + 1 * 1 + 1 * 0.5 = 3.5
我目前使用str.count实现,但是随着更多的值传入,它不再有效
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'] )
答案 0 :(得分: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
答案 1 :(得分:1)
您可以使用collections.Counter
:
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
没有矢量化的解决方案。为了提高性能,您应该支持列表推导,而不要使用熊猫str
方法。