Редактировать: @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()]
Предлагаемые решения все еще, к сожалению, не работают.
Любые мысли о том, как решить эту проблему? Спасибо всем за ваше время и вклад
Спасибо @JonClements. Ваш код вернул пустую строку. Первая часть кода df['REPORT'].apply(lambda x: re.findall(r"([^.]*?качество исследования было[^.]*\.)" ,x, флаги =re.I)) отлично работает, проблема заключается в последней части соответствия словаря содержимому
Это может (казаться) работать нормально ... но это неприятно и определенно сбивает вас с толку позже ... не могли бы вы предоставить образец df['REPORT'].head(10)
или что-то в этом роде - таким образом, кто-то действительно может работать с примерами данных и делать подходящие предложения. ..
Я думаю, что вы можете быть правы, теперь я изменил в соответствии с вашим предложением с небольшой правкой: df['Sentence']=df['REPOR'].str.extract(r"([^.]*?качество исследование было[^.]*\.)")
Однако я все еще не могу сопоставить его с элементами словаря, несмотря на то, что с помощью вашего метода у меня есть «более чистый» экстракт.
Что ж... если вы будете достаточно любезны и предоставите образцы данных, вам покажут, как это сделать...
Я пытаюсь, но не знаю, как. Я использую pycharm, и использование head() печатает только первые 20 символов строки.
Можете ли вы сделать df['REPORT'].head(10).tolist()
и редактировать свой пост с результатом этого в кодовом блоке?
Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?
Я создал 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: объект «Серия» не имеет атрибута «разделить».
хммм. Не уверен, что происходит сейчас, другая ошибка: ValueError («Длина значений не соответствует длине индекса») ValueError: Длина значений не соответствует длине индекса
Это связано с тем, что ни одно слово не соответствует. Это означает, что формат слов в вашем последнем предложении и значения в словаре не совпадают.
Это же я обещаю! Однако мне интересно, вызывает ли использование re.findall проблему, поскольку он может возвращать список, и строковый метод не будет работать с ним?
Я обновил код для извлечения строки: df['Sentence']=df['REPOR'].str.extract(r"([^.]*? Качество исследования было [^.]*\.) "), но использование вашего кода df['Quality']=[k for k,v в Quality_dic.items(), если v в df['Scentence'].str.split()] по-прежнему генерирует ошибку
Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?
@ user11484278 Ответ обновлен. Пожалуйста, проверьте сейчас. Если это решит вашу проблему, не забудьте принять ответ.
Я только что скопировал весь ваш код, но все равно выдает ошибку: Traceback (последний последний вызов): файл "<input>", строка 4, в <module> IndexError: индекс списка вне диапазона
Ваш Quality_dic
имеет bowel
вместо good
. Меняй и проверяй
Заметил это на самом деле и изменил на Quality_dic=dict([(1, 'отлично'), (2, 'хорошо'), (3, 'средне') , (4, 'плохо'), (5, 'неоценимо' ')]) все та же проблема. Я очень ценю вашу помощь в решении этого...
for loop
был обновлен в соответствии с вашим текущим Quality_dic
. Проверь сейчас
Наконец-то заработало! Большое спасибо
На самом деле, ваш Quality_dic
время от времени менялся. Итак, решение нужно было обновлять столько раз. Желаю вам удачного кодирования. Все это обычное дело для кодера ;-).
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]
Спасибо за предложение, действительно не сработало. Предложение теперь представляет собой столбец в фрейме данных.
TypeError: объект «StringMethods» не может быть вызван
@user11484278 user11484278 содержит ли строка вашего столбца в фрейме данных строку? sentence
здесь просто строка (также ваш вопрос касается строки - именно так я бы «искал список слов в строке и возвращал соответствующее слово»). Попробуйте заменить переменную sentence
в моем примере на df['sentence']` (или Scentence
, если хотите). Также, возможно, стоит обновить ваш вопрос примерами столбцов/строк =)
Я отредактировал сообщение сейчас, какие-либо предложения, пожалуйста?
Здесь не нужен
.apply
и скорее всего не нуженre.findall
... что вам даетdf['REPORT'].str.extract(r'(?i)the quality of the research was (.*?)\b')
?