Проверьте, существуют ли значения столбца в словаре [pandas] - PullRequest
0 голосов
/ 30 октября 2018

Может ли столбец (серия) фрейма данных использоваться в качестве условной проверки в словаре?

У меня есть столбец списков слов (разделенных твитов), которые я хотел бы передать в словарь вокаба, чтобы увидеть, все ли они существуют - если один из них не существует, я хотел бы пропустить его, продолжить и затем запустите функцию над существующими словами.

Этот код выдает ожидаемый результат для одной строки в столбце, однако при попытке применить его к нескольким столбцам я получаю сообщение об ошибке "список неразрешимых типов".

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 голосов
/ 30 октября 2018

Одним из решений является использование 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)
0 голосов
/ 30 октября 2018

Это должно делать то, что вы хотите:

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}

EDIT:

Чтобы отразить списки внутри столбца, см. Это вложенное понимание:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...