Найти числа после строки «Цитировать» в столбце данных

1

У меня есть журнал вызовов обслуживания клиентов на листе excel. Ниже приведен формат данных, которые я имею

So#   Comments
1   sjhsh QUOTE 234566
1   sdsds customer call QUote 239876 Call back
2   adsdfh unknown call from customer QUOTE 189067 sdkjsd woieweio 
3   QUOTE 657894 customer called for service

Я читаю эти данные из excel и вам нужно получить 6 цифр по тексту "QUOTE" в каждой строке, а затем добавить извлеченные цифры в качестве нового столбца

1. Строки могут содержать несколько упоминаний "QUOTE". 2. Строки могут вообще не иметь "QUOTE"

Может кто-то, пожалуйста, помогите мне с этим поиском подстроки, используя python

import pandas as pd
import re
file=pd.read_excel("C:/Users/rkatta/Desktop/Book1.xlsx")
file.set_index('Index', inplace=True, drop=True)
comments=file['InternalComments']
quotenum=[]

keyword= 'QUOTE'
for i in comments:
    try:
        befor_keyowrd, keyword, after_keyword = comments[i].partition(keyword)
        num=after_keyword[:6]
        quotenum.append(num)
    except AttributeError:
        befor_keyowrd, keyword, after_keyword =''
        quotenum.append(after_keyword)
  • 2
    Итак, если вообще не может быть «цитаты», каков шаблон? Просто цифры? df['your_cal'].str.extractall(r"(\d+)") ? Или df['your_col'].str.findall(r'\d+').apply(','.join) ?
  • 0
    Какой результат вы получаете? Будет ли Quote всегда в верхнем регистре? Все кавычки 6 цифр или больше?
Показать ещё 4 комментария
Теги:
pandas

2 ответа

1
Лучший ответ

Вам нужно заменить часть обработки столбцов следующей строкой:

file['InternalComments'] = file['Comments'].str.findall(r'(?i)quote\s+(\d+)').apply(','.join)

См. Демо-версию regex.

Регулярное выражение соответствует:

  • (?i) - нечувствительный к регистру режим
  • quote - подстрока quote
  • \s* - 0+ пробелы
  • (\d+) - Захват группы 1 (то, что возвращается findall): цифры 1+.

См. Демонстрацию кода Python:

from pandas import DataFrame
import pandas as pd
l = ['sjhsh QUOTE 234566', 'sdsds customer call QUote 239876 Call back', 'adsdfh unknown call from customer QUOTE 189067 sdkjsd woieweio', 'QUOTE 657894 customer called for service', 'QUOTE 657894 customer called for service QUOTE 657894 customer called for service', 'No qte']
file = pd.DataFrame(l, columns=['Comments'])
file['InternalComments'] = file['Comments'].str.findall(r'(?i)quote\s*(\d+)').apply(','.join)
file
                                            Comments InternalComments
0                                 sjhsh QUOTE 234566           234566
1         sdsds customer call QUote 239876 Call back           239876
2  adsdfh unknown call from customer QUOTE 189067...           189067
3           QUOTE 657894 customer called for service           657894
4  QUOTE 657894 customer called for service QUOTE...    657894,657894
5                                             No qte                 
2

(?i)(?<=QUOTE )\d+ захватит номера, которые вы ищете.

(?i) означает, что остальная часть шаблона нечувствительна к регистру, поэтому он будет соответствовать "QUOTE" и любому варианту слова.

(?<=QUOTE ) означает, что цифрам будет предшествовать слово quote и пробел

\d+ - ваш номер

демонстрация

  • 0
    OP говорит 2. Строки могут вообще не иметь «QUOTE» . Вы не можете полагаться на (?<=QUOTE ) взгляд назад.
  • 0
    Я предположил, что это означает, что если строка не содержит QUOTE , то строка также не будет содержать номер для цитаты. Если я ошибаюсь, дайте мне знать, и я посмотрю, смогу ли я найти решение.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню