Как извлечь числа после строкового образца в пандах - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть следующий фрейм данных в пандах

ID     text
1      T7MS1
2      T5HS2
3      T3XP1
4      Tank_3
5      TANK 5
6      System

Я хочу извлечь числа из столбца text, который следует следующей схеме

число после MS, HS и XP, число после TANK ичисло после Tank_

Желаемый фрейм данных

ID     text       new_text
1      T7MS1      1
2      T5HS2      2 
3      T3XP1      1
4      Tank_3     3
5      TANK 5     5
6      System     System

Я могу сделать это, следуя 1 шаблону

 m = re.search('TANK (\d+)', 'TANK 5', re.IGNORECASE)
 m.group(1)

Но как объединить весь шаблон в один и применить его кколонка.

Ответы [ 5 ]

0 голосов
/ 14 февраля 2019

Используйте следующее регулярное выражение, чтобы объединить все префиксы:

(?:MS|HS|XP|TANK |Tank_)(\d+)

Поскольку я использовал «группу без захвата» (?: ) для префиксов, ваш целевой номер все еще находится в группе 1, как вваш код.

0 голосов
/ 14 февраля 2019

Я хочу извлечь числа из текстового столбца, следующего за шаблоном

число после MS, HS и XP, число после TANK и число после Tank_

l = ['MS','HS','XP','TANK','Tank_']
t['new_text'] = t['text'].apply(lambda x: re.findall(r'(?<=[{}\s])\d'.format( [d for d in l if d in x][0]),x)[0])

Вывод

   ID    text new_text
0   1   T7MS1        1
1   2   T5HS2        2
2   3   T3XP1        1
3   4  Tank_3        3
4   5  TANK 5        5

Обновлено

Использование alexis regex

t['text'].apply(lambda x: re.findall(r'(?:MS|HS|XP|TANK |Tank_)(\d+)', x)[0] if re.findall(r'(?:MS|HS|XP|TANK |Tank_)(\d+)', x) else x)

Вывод

    ID    text new_text
0   1   T7MS1        1
1   2   T5HS2        2
2   3   T3XP1        1
3   4  Tank_3        3
4   5  TANK 5        5
5   6  System   System
0 голосов
/ 14 февраля 2019

Если число всегда является последним символом в термине, то вы можете просто использовать строковые методы серии Pandas, например:

df['new_text'] = df.text.str.slice(-1)

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

0 голосов
/ 14 февраля 2019

Если цифры всегда являются последней буквой, вам просто нужно использовать Series.str [-1] :

df= pd.DataFrame({'id': [1, 2, 3, 4, 5],
                 'text': ['T7MS1', 'T5HS2', 'T3XP1', 'Tank_3', 'TANK 5']})
df

    id  text
0   1   T7MS1
1   2   T5HS2
2   3   T3XP1
3   4   Tank_3
4   5   TANK 5


df['new_text'] = df.text.str[-1]
df

   id   text    new_text
0   1   T7MS1    1
1   2   T5HS2    2
2   3   T3XP1    1
3   4   Tank_3   3
4   5   TANK 5   5

Или, если вы хотите число после MS, HSи XP, TANK и только Tank_:

df['new_text'] = df.text.str.extract(r'(?:MS|HS|XP|TANK |Tank_)(\d+)')
df

id  text    new_text
0   1   T7MS1    1
1   2   T5HS2    2
2   3   T3XP1    1
3   4   Tank_3   3
4   5   TANK 5   5

Вы можете заполнить нулевые значения, используя:

df['new_text'] = df['new_text'].fillna(df['text'])
    id  text    new_text
0   1   T7MS1   1
1   2   T5HS2   2
2   3   T3XP1   1
3   4   Tank_3  3
4   5   TANK 5  5
5   6   System  System
0 голосов
/ 14 февраля 2019

Простая функция с оператором if может решить вашу проблему:

s = pd.Series(["T7MS1","Tank_3","TANK 5", "System"])

pattern= "[MS|HS|XP|TANK |Tank_](\d+)"
def fetch_num(txt):
    result = re.findall(pattern,txt)
    if result: # if matched
        return result[0]
    else:
        return txt

s.apply(fetch_num)

Или вы можете использовать этот шаблон r"\d+$", если не хотите сопоставлять число после определенного слова.
$ в шаблоне означает конец строки .

Возвращает:

0         1
1         3
2         5
3    System
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...