Удаление лишних частей строки по разделителям. Data Frame, pandas

Есть dataframe, в нем столбик "Объем мозга" в котором имеются строковые данные нескольких видов. Нужно убрать то, что находится в скобках, оставить только число без скобок и без тире. Если комбинации ')-' или '-(' не было, то ничего вообще делать не нужно.

При выполнении следующего кода:

def del_part_str(x):
  l = x.find(')-')
  r = x.rfind('-(')
  x = x[l+2:r]
  return(x)


df['new'] = df['Объем мозга'].apply(del_part_str) 

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

Исходник:

  1. (850-870?-900-930-935?)-940-(953-1000??)
  2. (750-850-900?)-908
  3. 1488.0
  4. 1518-(1520)

Результат:

  1. 940
  2. 90
  3. 488
  4. 518

Почему так происходит и как нужно написать что бы получился ожидаемый результат?


Ответы (1 шт):

Автор решения: Namerek
import re

pat = re.compile(r'-?\(.+?\)-?')

items = [
    '(850-870?-900-930-935?)-940-(953-1000??)',
    '(750-850-900?)-908',
    '1488.0',
    '1518-(1520)',
]
print(
    *map(lambda x: pat.sub('', x), items),
    sep='\n'
)
# 940
# 908
# 1488.0
# 1518

Тоесть в Вашем случае можно записать так

import re

pat = re.compile(r'-?\(.+?\)-?')

def del_part_str(x):
    return pat.sub('', x)

df['new'] = df['Объем мозга'].apply(del_part_str)
→ Ссылка