获取熊猫弦系列的加权值

时间:2018-10-23 07:16:09

标签: python string pandas count counter

系列如下:

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'] )

2 个答案:

答案 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方法。