Запросите в столбце данных pandas текстовую фразу, которая может содержать или не содержать слова в этой фразе - PullRequest
0 голосов
/ 17 сентября 2018

Цель: запросить в столбце данных pandas текстовую фразу, которая может содержать или не содержать слова в этой фразе. На высоком уровне фраза "word1 word2". Между словом 1 и словом 2 могут быть или не быть другие слова.

Это звучит как дурак, однако я попробовал ТАК ответы здесь:

Как извлечь подстроку из строки в Python?

Регулярное выражение: сопоставление и группировка переменного числа слов, разделенных пробелом

Соответствует тексту между двумя строками с регулярным выражением

Извлечение текстовой информации между двумя определенными текстами

И несколько других, и все они пропускают случай, когда между словами 1 и 2 нет слов.

Все эти высоко оцененные решения опираются (. +?) Между word1 и word2.

Пример: слово1 (. +?) Слово2

Вышеприведенное работает хорошо, если между word1 и word2 есть 1+ слова. Однако, если между word1 и word2 нет слов NO, то он не возвращает никаких результатов, однако я хотел бы, чтобы он возвращал результаты и в этом конкретном случае, потому что текстовая фраза содержит word1 word2.

Кроме того, данные будут очищены заранее, поэтому нет необходимости учитывать заглавные буквы, запятые или другие ложные символы.

Мой код и испытания приведены ниже. Вместо word1 word2 я использую «кусочки доставлены» в качестве текстовой фразы.

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

Заранее спасибо.

import pandas as pd
df = pd.Series(['a', 'b', 'c', 'some pieces delivered on time', 'all pieces not delivered', 'most pieces were never delivered at all', 'the pieces will never ever be delivered', 'some delivered', 'i received broken pieces'])

print("Baseline - Desired results SHOULD contain:\n", df.iloc[3:7])

# The following options all miss one or more rows from the desired results. 
# Just uncomment rgx = to run a regex. 
rgx = r'pieces\s(.*?)\sdelivered'
#rgx = r'pieces\s(\w*)\sdelivered'
#rgx = r'pieces\s(\w*)+\sdelivered'
#rgx = r'pieces\s(\w)*\sdelivered'
#rgx = r'pieces\s(\w+\s)+\sdelivered'
#rgx = r'pieces\s(.*)\sdelivered'
#rgx = r'pieces\s+((%s).*?)\sdelivered'

df2 = df[df.str.contains(rgx)]
print("\nActual results were:\n", df2)

1 Ответ

0 голосов
/ 17 сентября 2018

Второй '\s' находится в неправильном положении. Вам это нужно, только если два слова не соседствуют:

df[df.str.contains(r'pieces\s(?:.+?\s)?delivered')]
#3              some pieces delivered on time
#4                   all pieces not delivered
#5    most pieces were never delivered at all
#6    the pieces will never ever be delivered
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...