Как использовать регулярное выражение Python, чтобы удалить все, кроме шаблона - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть фрейм данных pandas с некоторыми значениями рейтинга в одном столбце.Моя цель - извлечь некоторые маркеры для новых серий.У меня есть список уникальных значений, таких как:

['nan' 'AAA' 'AA+' 'AA' 'A+' 'A-' 'AA-' 'BB+' 'BBB' 'BBB-' 'A' 'BB-'
 'BBB+' 'B+' 'BB' 'B' 'A *-' 'A- *-' 'B-' 'CCC+' 'CCC' 'CCC-' 'CC' 'SD'
 'CCC+ *-' 'BB *-' 'BB- *-' 'B *-' 'B+ *-' 'B- *-' 'BBB+ *-' 'CCC- *-'
 'BBB- *-' 'BB+ *-' 'A+ *-' 'BBB *-' 'AAA *-' 'AA *-' 'AA- *-' 'NR']

Итак, я пытаюсь использовать дополнительные шаблоны ' *-' и ' *+' перед его удалением, чтобы создать новый столбец данных со значениями '-'(для рейтингов, которые заканчиваются ' *-'), '+' (для ' *+' окончание) и '' или nan для других типов рейтинга.

Простое удаление для меня вполне понятно (что-то вроде'( \*.)' в re.sub), но вопрос в том, чтобы выбрать маркеры, прежде чем делать это.Я не специалист по регулярным выражениям, поэтому я провожу много времени, пытаясь изучить функцию re.sub с такими шаблонами, как '[^(\*.)]', '[^(\*[\+\-])]' безрезультатно.

1 Ответ

0 голосов
/ 27 сентября 2019

Вы можете сделать следующее.

import pandas as pd
import re

df = pd.DataFrame({'col0':['nan', 'AAA', 'AA+', 'AA', 'A+', 'A-', 'AA-', 
'BB+', 'BBB', 'BBB-', 'A', 'BB-', 'BBB+', 'B+', 'BB', 'B', 'A *-',
 'A- *-', 'B-', 'CCC+', 'CCC', 'CCC-', 'CC', 'SD', 'CCC+ *-', 'BB *-',
 'BB- *-', 'B *-', 'B+ *-', 'B- *-', 'BBB+ *-', 'CCC- *-',
 'BBB- *-', 'BB+ *-', 'A+ *-', 'BBB *-', 'AAA *-', 'AA *-', 'AA- *-', 'NR']})

df['new_col'] = [re.search('([-+])$', x).group(0) 
    if re.search('([-+])$', x) else '' for x in df.col0]

Что даст

       col0 new_col
0       nan        
1       AAA        
2       AA+       +
3        AA        
4        A+       +
5        A-       -
6       AA-       -
7       BB+       +
8       BBB        
9      BBB-       -
10        A        
11      BB-       -
12     BBB+       +
13       B+       +
14       BB        
15        B        
16     A *-       -
17    A- *-       -
18       B-       -
19     CCC+       +
20      CCC        
21     CCC-       -
22       CC        
23       SD        
24  CCC+ *-       -
25    BB *-       -
26   BB- *-       -
27     B *-       -
28    B+ *-       -
29    B- *-       -
30  BBB+ *-       -
31  CCC- *-       -
32  BBB- *-       -
33   BB+ *-       -
34    A+ *-       -
35   BBB *-       -
36   AAA *-       -
37    AA *-       -
38   AA- *-       -
39       NR        

То, что я делаю, это циклически перебираю строки столбца, затем проверяю, является ли последний символ + или -.Если так, то это помещает это в группу 0, которую я называю.Если + или - не найден, возвращается объект None, который оценивается как False и вместо него возвращается ''.Этот список может быть назначен новому столбцу.

Если вы ищете строковый литерал *- и *+, то вам нужно внести это небольшое изменение.

df['new_col'] = [re.search(r'\*([-+])$', x).group(0) 
    if re.search(r'\*([-+])$', x) else '' for x in df.col0]

Для чего это стоит, я проверил все этоPython 3.7 и Pandas 0.25.1.

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