Pandas DataFrame - извлекает строку между двумя строками и включает первый разделитель - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть следующие строки в столбце на фрейме данных:

"LOCATION: FILE-ABC.txt"
"DRAFT-1-FILENAME-ADBCD.txt"

И я хочу извлечь все, что находится между словом FILE и ".". Но я хочу включить первый разделитель. В основном я пытаюсь вернуть следующий результат:

"FILE-ABC"
"FILENAME-ABCD"

Для этого я использую следующий скрипт:

df['field'] = df.string_value.str.extract('FILE/(.w+)')

Но я не могу вернуть нужную информацию (всегда получаю Нет).

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2020

Вы можете выполнить sh все это в регулярном выражении, не используя срезы строк.

df['field'] = df.string_value.str.extract('(FILE.*(?=.txt))')
  • ФАЙЛ - это то, с чего мы начинаем совпадение на
  • . * захватывает любое количество символов
  • (? =) - это предварительное утверждение, которое не требует использования.

Удобный инструмент регулярных выражений https://pythex.org/

2 голосов
/ 04 февраля 2020

Вы можете создать группу захвата, которая будет жадно захватывать (включая) 'FILE' до последнего периода. Или вы можете сделать его не жадным, поэтому он останавливается на первом . после ФАЙЛА.

import pandas as pd
df = pd.DataFrame({'string_value': ["LOCATION: FILE-ABC.txt", "DRAFT-1-FILENAME-ADBCD.txt",
                                    "BADFILENAME.foo.txt"]})

df['field_greedy'] = df['string_value'].str.extract('(FILE.*)\.')
df['field_not_greedy'] = df['string_value'].str.extract('(FILE.*?)\.')

print(df)
                 string_value    field_greedy field_not_greedy
0      LOCATION: FILE-ABC.txt        FILE-ABC         FILE-ABC
1  DRAFT-1-FILENAME-ADBCD.txt  FILENAME-ADBCD   FILENAME-ADBCD
2         BADFILENAME.foo.txt    FILENAME.foo         FILENAME
2 голосов
/ 04 февраля 2020

Если строки всегда заканчиваются на .txt, вы можете попробовать следующее:

df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]

Пример:

import pandas as pd
text = ["LOCATION: FILE-ABC.txt","DRAFT-1-FILENAME-ADBCD.txt"]
data = {'index':[0,1],'string_value':text}
df = pd.DataFrame(data)
df['field'] = df['string_value'].str.extract('(FILE.*)')[0].str[:-4]

Вывод:

   index                string_value           field
0      0      LOCATION: FILE-ABC.txt        FILE-ABC
1      1  DRAFT-1-FILENAME-ADBCD.txt  FILENAME-ADBCD
...