Извлечение цифр после определенных символов в панде - PullRequest
1 голос
/ 10 октября 2019

У меня есть фрейм данных, и один из столбцов содержит строки типа 'weak=30', и я хочу извлечь цифры после строки = и создать новый столбец с именем digits.

Я использую re.searchчтобы найти цифры, но пока что выдает ошибку.

Пример данных

import pandas as pd
import re

raw_data = {'patient': [1, 2, 3,4, 6],
        'treatment': [0, 1, 0, 1, 0],
        'score': ['strong=42', 'weak=30', 'weak=12', 'pitt=12', 'strong=42']}

df = pd.DataFrame(raw_data, columns = ['patient', 'treatment', 'score'])

df

   patient  treatment      score
0        1          0  strong=42
1        2          1    weak=30
2        3          0    weak=12
3        4          1    pitt=12
4        6          0  strong=42

Итак, я попытался

df=df.assign(digits=[int(re.search(r'\d+', x)) for x in df.score])

TypeError: int () аргументдолжна быть строкой, байтовоподобным объектом или числом, а не 're.Match'

В R вы просто можете сделать

mutate(digits=as.numeric(gsub(".*=","",score))

Какой будет эквивалентная функцияв python pandas?

Ожидаемый результат

   patient  treatment      score   digits
0        1          0  strong=42     42
1        2          1    weak=30     30
2        3          0    weak=12     12
3        4          1    pitt=12     12
4        6          0  strong=42     42

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вы можете просто использовать str.replace с вашим регулярным выражением R:

df['digits'] = df['score'].str.replace(r'.*=', '').astype(int)

Шаблон .*= соответствует всем 0+ символам, кроме символов разрыва строки, как можно больше. до последнего = и replace с помощью '' удаляет этот текст.

Или вы можете использовать подход с извлечением цифр после = в конце строки:

df['digits'] = df['score'].str.extract(r'=(\d+)$', expand=False).astype(int)

Здесь =(\d+)$ соответствует =, затем захватывает в группу 1 любую одну или несколько цифр и затем устанавливает позицию в конце строки.

В обоих случаях выводим:

>>> df
   patient  treatment      score  digits
0        1          0  strong=42      42
1        2          1    weak=30      30
2        3          0    weak=12      12
3        4          1    pitt=12      12
4        6          0  strong=42      42
0 голосов
/ 11 октября 2019

re.search возвращает MatchObject, а не непосредственно совпадающую строку. См. https://docs.python.org/3.7/library/re.html#match-objects

Если вы хотите строку, вы можете попробовать что-то вроде:

re.search(r'\d+', x).group(0)
...