Вы можете сделать следующее.
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.