列表的数据框列(系列)可以用作字典中的条件检查吗?
我有一列单词列表(拆分的tweet),我想将它们馈送到vocab词典中以查看它们是否都存在-如果不存在,我想跳过它,继续然后对现有单词运行一个函数。
此代码为该列中的一行产生了预期的结果,但是,如果我尝试将其应用于多个列,则会收到“无法散列的类型列表”错误。
w2v_sum = w2v[[x for x in train['words'].values[1] if x in w2v.vocab]].sum()
使用可复制的示例进行编辑:
df = pd.DataFrame(data={'words':[['cow','bird','cat'],['red','blue','green'],['low','high','med']]})
d = {'cow':1,'bird':4,'red':1,'blue':1,'green':1,'high':6,'med':3}
期望的输出是总计(词典中单词的总和):
total words
0 5 [cow, bird, cat]
1 3 [red, blue, green]
2 9 [low, high, med]
答案 0 :(得分:1)
这应该做您想要的:
import pandas as pd
df = pd.DataFrame(data={'words':[['cow','bird','cat'],['red','blue','green'],['low','high','med']]})
d = {'cow':1,'bird':4,'red':1,'blue':1,'green':1,'high':6,'med':3}
编辑:
要反映列内的列表,请参阅以下嵌套理解:
list_totals = [[d[x] for x in y if x in d] for y in df['words'].values]
list_totals = [sum(x) for x in list_totals]
list_totals
[5, 3, 9]
然后您可以将list_totals作为一列添加到您的pd。
答案 1 :(得分:0)
一种解决方案是使用collections.Counter
和列表理解:
from collections import Counter
d = Counter({'cow':1,'bird':4,'red':1,'blue':1,'green':1,'high':6,'med':3})
df['total'] = [sum(map(d.__getitem__, L)) for L in df['words']]
print(df)
words total
0 [cow, bird, cat] 5
1 [red, blue, green] 3
2 [low, high, med] 9
或者,如果您始终有固定数量的单词,则可以分成多个系列并使用pd.DataFrame.applymap
:
df['total'] = pd.DataFrame(df['words'].tolist()).applymap(d.get).sum(1).astype(int)