Python - Pandas - Удалять только те разбиения, которые имеют только цифры c, но сохраняются, если они имеют буквенное - PullRequest
6 голосов
/ 12 февраля 2020

У меня есть фрейм данных, который имеет два значения:

df = pd.DataFrame({'Col1': ['Table_A112', 'Table_A_112']})

Я пытаюсь удалить цифры c, если в случае разделения ('_') есть только цифры c цифр. Желаемый вывод:

Table_A112
Table_A_

Для этого я использую следующий код:

import pandas as pd
import difflib
from tabulate import tabulate
import string

df = pd.DataFrame({'Col1': ['Table_A112', 'Table_A_112']})
print(tabulate(df, headers='keys', tablefmt='psql'))
df['Col2'] = df['Col1'].str.rstrip(string.digits)
print(tabulate(df, headers='keys', tablefmt='psql'))

Но он дает мне следующий вывод:

Table_A
Table_A_

Как могу делать что хочу?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 12 февраля 2020

Вы можете сделать что-то вроде:

s = df['Col1'].str.split('_',expand=True).stack()
s.mask(s.str.isdigit(), '').groupby(level=0).agg('_'.join)

Вывод:

0    Table_A112
1      Table_A_
dtype: object
4 голосов
/ 12 февраля 2020

Вот один из способов использования str.replace:

df = pd.DataFrame({'Col1': ['Table_A112', 'Table_A_112', 'Table_112_avs']})

print(df)

        Col1
0     Table_A112
1    Table_A_112
2  Table_112_avs

df.Col1.str.replace(r'(?:^|_)(\d+)(?:$|_)', '_', regex=True)

0    Table_A112
1      Table_A_
2     Table_avs
Name: Col1, dtype: object

См. demo

1 голос
/ 12 февраля 2020

Если вы настаиваете на решении регулярных выражений, вы можете использовать pandas.replace() и положительный взгляд за r'(?<=_)\d+'

import pandas as pd
from tabulate import tabulate

df = pd.DataFrame({'Col1': ['Table_A112', 'Table_A_112']})
print(tabulate(df, headers='keys', tablefmt='psql'))
df= df.replace(regex=r'(?<=_)\d+', value='')
print(tabulate(df, headers='keys', tablefmt='psql'))

, который дает желаемый результат.

0 голосов
/ 12 февраля 2020

Я думаю, что использование str.replace с группой захвата делает схему намного проще

sample df

Out[1063]:
          Col1
0   Table_A112
1  Table_A_112
2  Table_111_B

df.Col1.str.replace(r'(_)\d+', r'\1')

Out[1064]:
0    Table_A112
1      Table_A_
2      Table__B
Name: Col1, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...