Подсчет списка слов в списке строк с использованием python

Итак, у меня есть кадр данных pandas со строками токенизированных строк в столбце с именем story. У меня также есть список слов в списке с именем selected_words. Я пытаюсь подсчитать экземпляры любого из selected_words в каждой из строк в истории столбца.

Код, который я использовал до того, как он работал,

CCwordsCount=df4.story.str.count('|'.join(selected_words))

Теперь это дает мне значения NaN для каждой строки.

Ниже приведены первые несколько строк истории столбца в df4. Фрейм данных содержит чуть более 400 строк статей NYTimes.

0      [it, was, a, curious, choice, for, the, good, ...
1      [when, he, was, a, yale, law, school, student,...
2      [video, bitcoin, has, real, world, investors, ...
3      [bitcoin, s, wild, ride, may, not, have, been,...
4      [amid, the, incense, cheap, art, and, herbal, ...
5      [san, francisco, eight, years, ago, ernie, all...

Это список selected_words

selected_words = ['accept', 'believe', 'trust', 'accepted', 'accepts', 'trusts', 'believes', \
                  'acceptance', 'trusted', 'trusting', 'accepting', 'believes', 'believing', 'believed',\
                 'normal', 'normalize', ' normalized', 'routine', 'belief', 'faith', 'confidence', 'adoption', \
                  'adopt', 'adopted', 'embrace', 'approve', 'approval', 'approved', 'approves']

Ссылка на мой файл df4 .csv


person Jesse-Burton Nicholson    schedule 13.05.2020    source источник
comment
Является ли каждая запись в истории списком, содержащим строку, как в ["it, was, a, curious, choice, for, the, good, ..."]?   -  person DarrylG    schedule 13.05.2020
comment
Да, я считаю, что каждая запись представляет собой список слов. Я использовал .split, чтобы разделить предложения на слова. Подсчеты должны быть связаны с каждой записью, потому что я сопоставляю подсчеты с другими данными за те же даты, что и истории.   -  person Jesse-Burton Nicholson    schedule 13.05.2020


Ответы (2)


Каждая запись истории выглядит как список, содержащий строку.

Используйте карту, чтобы получить строку из списка перед применением str следующим образом.

CCwordsCount = df4.story.map(lambda x: ''.join(x[1:-1])).str.count('|'.join(selected_words))

print(CCwordsCount.head(20))   # Show first 20 story results

Вывод

0      1
1      2
2      5
3      7
4      0
5      1
6     10
7      8
8      2
9      2
10     8
11     0
12     0
13     2
14     0
15     4
16     2
17     9
18     0
19     0
Name: story, dtype: int64

Пояснение

Каждая история была в списке, преобразованном в строку, поэтому в основном:

"['it', 'was', 'a', 'curious', 'choice', 'for', 'the', 'good', 'wife', ...]"

Преобразуется в список слов путем удаления «[» и «]» и объединения слов

map(lambda x: ''.join(x[1:-1]))

Это приводит к тому, что слова разделяются запятыми в кавычках. Для первой строки это приводит к строке:

'it', 'was', 'a', 'curious', 'choice', 'for', ...
person DarrylG    schedule 13.05.2020
comment
@Jesse-BurtonNicholson Проверьте одну из своих историй. Есть ли в нем какие-либо из выбранных слов? - person DarrylG; 13.05.2020
comment
Да, историй более 400, и большинство из них содержат хотя бы одно из выбранных_слов. - person Jesse-Burton Nicholson; 13.05.2020
comment
@ Jesse-BurtonNicholson - в предоставленной вами сокращенной версии историй не было выбранных слов. Можете ли вы дать мне больше историй для тестирования? Кроме того, когда я добавляю несколько слов из историй в вашем посте к выбранным словам, я получаю ненулевые значения. - person DarrylG; 13.05.2020
comment
Я обновил сообщение со ссылкой на экспортированный файл .csv для df4. - person Jesse-Burton Nicholson; 13.05.2020
comment
Кстати, большое спасибо за вашу помощь с этим. Мой код работал в конце прошлого года, и я только что вернулся к нему, чтобы обновить проект, и он не работал, это очень расстраивало. - person Jesse-Burton Nicholson; 13.05.2020
comment
@ Jesse-BurtonNicholson - рад помочь. Не забывайте что делать, когда кто-то отвечает на мой вопрос - person DarrylG; 13.05.2020

Функция .find() может быть полезна. И реализовать это можно разными способами. Если у вас нет другой цели для необработанной статьи, это может быть куча строк. Тогда попробуйте это, вы также можете поместить их в словарь и зациклиться.

def find_words(text, words):
    return [word for word in words if word in text]

sentences = "0  [it, was, a, curious, choice, for, the, good, 1      [when, he, was, a, yale, law, school, student, 2      [video, bitcoin, has, real, world, investors, 3      [bitcoin, s, wild, ride, may, not, have, been, 4      [amid, the, incense, cheap, art, and, herbal, 5      [san, francisco, eight, years, ago, ernie, all"

search_keywords=['accept', 'believe', 'trust', 'accepted', 'accepts', 'trusts', 'believes', \
                  'acceptance', 'trusted', 'trusting', 'accepting', 'believes', 'believing', 'believed',\
                 'normal', 'normalize', ' normalized', 'routine', 'belief', 'faith', 'confidence', 'adoption', \
                  'adopt', 'adopted', 'embrace', 'approve', 'approval', 'approved', 'approves', 'good']

found = find_words(sentences, search_keywords)

print(found)

Примечание. Я не имел в виду фрейм данных панды, который я создаю.

person parlad    schedule 13.05.2020