Очистить серию pandas с использованием регулярного выражения - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь очистить столбец с именем «history_rank» в pandas кадре данных. Он содержит строковые данные. Вот образец содержимого:

       historical_rank
...    ...
122    1908
123    O'   
124 
125    1911  
126    1912  
127    1913 * * * 2010 * * *  
128
129    1914  
130    1915
131  
132
133    1918  
134    (First served 1989 to 1999)
...    ...

Данные, которые я хочу сохранить, - это четырехзначные git числа в строках 122, 125, 126, 127, 129, 130 и 133. В других местах в серии это число (исторический ранг) может состоять из одной, двух или трех цифр. Он всегда начинает строку, и после нее всегда стоит пробел. Я хочу использовать регулярное выражение, чтобы сохранить желаемый шаблон - r '\ d {1,4} (? = \ S)' - и удалить все остальное на протяжении всей серии. Какой правильный код для этого? Спасибо.

Ответы [ 4 ]

1 голос
/ 25 мая 2020

Вам следует подумать об использовании вашего регулярного выражения в методе str.extract , имея в виду, что этот метод требует, чтобы регулярное выражение содержало хотя бы одну группу захвата.

Если вы планируете сопоставление одну, две, три или четыре цифры в начале строки, за которыми следует хотя бы один пробел (судя по вашему шаблону \d{1,4}(?=\s)), вы должны попробовать

df['historical_rank_clean'] = df['historical_rank'].str.extract('^(\d{1,4})\s', expand=False).fillna('')

Обратите внимание на (...) в В шаблоне партезы образуют группу захвата, и ее содержимое будет использоваться для заполнения ячеек в новом столбце historical_rank_clean. .fillna('') заполнит эти записи без совпадения пустой строкой.

Некоторые другие идеи регулярных выражений:

  • r'^(\d{2}(?:\d{2})?)\b' - извлечь два или четыре di git фрагменты в начале строки, за которыми следует граница слова
  • r'^((?:20|19)?\d{2})\b' - аналогично приведенному выше, но только с учетом лет, начинающихся с 19 или 20, если это четыре-ди git лет .

См. Демонстрацию регулярного выражения

1 голос
/ 25 мая 2020

ОИТН

df['historical_rank_new']=df['historical_rank'].str.extract('(^[\d]{1,4})')
df
0 голосов
/ 26 мая 2020

В качестве альтернативы вы можете использовать str.replace и использовать шаблон с группой захвата, чтобы сохранить то, что вы хотите, и сопоставить то, что вы хотите удалить.

  • ^ Начало строки
  • ( Захват группа 1 (Сохранить)
    • \d{1,4} Соответствие 1–4 цифр
  • ) Закрыть группу
  • \s Сопоставить пробельный символ
  • | Или
  • .+ Сопоставить любой символ 1+ раз

In при замене используйте группу 1 r'\1'

^(\d{1,4})\s|.+

Regex demo

Например

df.historical_rank = df.historical_rank.str.replace(r"^(\d{1,4})\s|.+", r'\1')
0 голосов
/ 25 мая 2020

Чтобы улучшить ответ @wwnde, вы можете использовать:

df['historical_rank_new']=df['historical_rank'].str.extract('(^\d{1,4}$)')

Вот на repl.it

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...