Поиск списка слов в строке и возврат совпадающего слова

Редактировать: @rong @shaik moeed Вот код, который генерирует часть фрейма данных и проблему, с которой я столкнулся:

temp = [[1, 'blblblblblb. The quaity of research was good. blblblblb'],
        [2, 'blblblblblb. The quaity of research was average. blblblblb'],
        [3, 'blblblblblb. The quaity of research was poor. blblblblb'],
        [4, 'blblblblblb. The quaity of research was good. blblblblb']
        ]
Data = pd.DataFrame(temp,columns=['ID','Report'])
Data['Sentence']=Data['Report'].str.extract(r"([^.]*?The quaity of research was [^.]*\.)")

Quality_dic=dict([(1, 'excellent'), (2, 'good'),  (3, 'average') , (4, 'poor'), (5, 'unassessable')])



Data['Quality']=[k for k,v in Quality_dic.items() if v in  Data['Sentence'].str.split()]

Предлагаемые решения все еще, к сожалению, не работают.

Любые мысли о том, как решить эту проблему? Спасибо всем за ваше время и вклад

Здесь не нужен .apply и скорее всего не нужен re.findall... что вам дает df['REPORT'].str.extract(r'(?i)the quality of the research was (.*?)\b')?

Jon Clements 22.05.2019 12:47

Спасибо @JonClements. Ваш код вернул пустую строку. Первая часть кода df['REPORT'].apply(lambda x: re.findall(r"([^.]*?качество исследования было[^.]*\.)" ,x, флаги =re.I)) отлично работает, проблема заключается в последней части соответствия словаря содержимому

AM_MA 22.05.2019 12:53

Это может (казаться) работать нормально ... но это неприятно и определенно сбивает вас с толку позже ... не могли бы вы предоставить образец df['REPORT'].head(10) или что-то в этом роде - таким образом, кто-то действительно может работать с примерами данных и делать подходящие предложения. ..

Jon Clements 22.05.2019 12:55

Я думаю, что вы можете быть правы, теперь я изменил в соответствии с вашим предложением с небольшой правкой: df['Sentence']=df['REPOR'].str.extract(r"([^.]*?качество исследование было[^.]*\.)")

AM_MA 22.05.2019 13:23

Однако я все еще не могу сопоставить его с элементами словаря, несмотря на то, что с помощью вашего метода у меня есть «более чистый» экстракт.

AM_MA 22.05.2019 13:26

Что ж... если вы будете достаточно любезны и предоставите образцы данных, вам покажут, как это сделать...

Jon Clements 22.05.2019 13:40

Я пытаюсь, но не знаю, как. Я использую pycharm, и использование head() печатает только первые 20 символов строки.

AM_MA 22.05.2019 13:53

Можете ли вы сделать df['REPORT'].head(10).tolist() и редактировать свой пост с результатом этого в кодовом блоке?

Jon Clements 22.05.2019 14:14

Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?

AM_MA 24.05.2019 13:08
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
9
184
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я создал df как ваши данные и реализовал полностью, как вам нужно.

В Quality_dic у вас есть один и тот же ключ для Good и Unassessable. Таким образом, Good переопределит Unassessable.

Попробуй сейчас,

>>> temp = [[1, 'blblblblblb. The quaity of research was good. blblblblb'],
        [2, 'blblblblblb. The quaity of research was average. blblblblb'],
        [3, 'blblblblblb. The quaity of research was poor. blblblblb'],
        [4, 'blblblblblb. The quaity of research was good. blblblblb']
        ]

>>> Data = pd.DataFrame(temp,columns=['ID','Report'])

>>> Data['Sentence']=Data['Report'].str.extract(r"([^.]*?The quaity of research was [^.]*\.)")

>>> index_col = []

>>> for index, row in Data.iterrows():
        index_col.append([k for k,v in Quality_dic.items() if v.lower() in  row['Sentence'].replace('.','').split()][0])
>>> Data["index_col"]=index_col

Выход:

>>> Data

   ID    ...    index_col
0   1    ...            2
1   2    ...            3
2   3    ...            4
3   4    ...            2

[4 rows x 4 columns]

Примечание:

... - means columns are hiding as there is no space to display.

Спасибо за ваше предложение, это вернуло ошибку: AttributeError: объект «Серия» не имеет атрибута «разделить».

AM_MA 22.05.2019 12:56

хммм. Не уверен, что происходит сейчас, другая ошибка: ValueError («Длина значений не соответствует длине индекса») ValueError: Длина значений не соответствует длине индекса

AM_MA 22.05.2019 13:07

Это связано с тем, что ни одно слово не соответствует. Это означает, что формат слов в вашем последнем предложении и значения в словаре не совпадают.

shaik moeed 22.05.2019 13:10

Это же я обещаю! Однако мне интересно, вызывает ли использование re.findall проблему, поскольку он может возвращать список, и строковый метод не будет работать с ним?

AM_MA 22.05.2019 13:13

Я обновил код для извлечения строки: df['Sentence']=df['REPOR'].str.extract(r"([^.]*? Качество исследования было [^.]*\.) "), но использование вашего кода df['Quality']=[k for k,v в Quality_dic.items(), если v в df['Scentence'].str.split()] по-прежнему генерирует ошибку

AM_MA 22.05.2019 13:34

Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?

AM_MA 24.05.2019 13:07

@ user11484278 Ответ обновлен. Пожалуйста, проверьте сейчас. Если это решит вашу проблему, не забудьте принять ответ.

shaik moeed 24.05.2019 13:32

Я только что скопировал весь ваш код, но все равно выдает ошибку: Traceback (последний последний вызов): файл "<input>", строка 4, в <module> IndexError: индекс списка вне диапазона

AM_MA 24.05.2019 13:41

Ваш Quality_dic имеет bowel вместо good. Меняй и проверяй

shaik moeed 24.05.2019 13:44

Заметил это на самом деле и изменил на Quality_dic=dict([(1, 'отлично'), (2, 'хорошо'), (3, 'средне') , (4, 'плохо'), (5, 'неоценимо' ')]) все та же проблема. Я очень ценю вашу помощь в решении этого...

AM_MA 24.05.2019 13:47
for loop был обновлен в соответствии с вашим текущим Quality_dic. Проверь сейчас
shaik moeed 24.05.2019 13:51

Наконец-то заработало! Большое спасибо

AM_MA 24.05.2019 13:52

На самом деле, ваш Quality_dic время от времени менялся. Итак, решение нужно было обновлять столько раз. Желаю вам удачного кодирования. Все это обычное дело для кодера ;-).

shaik moeed 24.05.2019 13:56
quality_dic = dict([(1, 'Excellent'), (2, 'Good'), (3, 'Average') , (4, 'Poor'), (2, 'Unassessable')])

sentence = 'The quality of the research was Poor' # note that 'Poor' here is capitalized

for rating in quality_dic:
    if quality_dic[rating] in sentence:
        print(quality_dic[rating]) # df['Quality'] = quality_dic[rating]

# or if you want a one-liner:
df['Quality'] = [quality_dic[rating] in sentence for rating in quality_dic]

Спасибо за предложение, действительно не сработало. Предложение теперь представляет собой столбец в фрейме данных.

AM_MA 22.05.2019 13:15

TypeError: объект «StringMethods» не может быть вызван

AM_MA 22.05.2019 13:25

@user11484278 user11484278 содержит ли строка вашего столбца в фрейме данных строку? sentence здесь просто строка (также ваш вопрос касается строки - именно так я бы «искал список слов в строке и возвращал соответствующее слово»). Попробуйте заменить переменную sentence в моем примере на df['sentence']` (или Scentence, если хотите). Также, возможно, стоит обновить ваш вопрос примерами столбцов/строк =)

ron_g 22.05.2019 14:30

Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?

AM_MA 24.05.2019 13:07

Другие вопросы по теме