检查列值是否存在于字典[pandas]

时间:2018-10-30 16:30:08

标签: python pandas dictionary

列表的数据框列(系列)可以用作字典中的条件检查吗?

我有一列单词列表(拆分的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]

2 个答案:

答案 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)