Pandas регулярное выражение, замените группу на char - PullRequest
2 голосов
/ 09 января 2020

Проблема

Как заменить X на _, учитывая следующий фрейм данных:

data = {'street':['13XX First St', '2XXX First St', '47X Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 

Улицы необходимо редактировать, заменяя каждый X подчеркиванием _.

Обратите внимание, что количество целых чисел меняется, равно как и число X. Кроме того, названия улиц, такие как Xerxes, не должны редактироваться в _er_es, а должны оставаться неотредактированными. Изменится только раздел номера улицы.

Желаемый результат

data = {'street':['13__ First St', '2___ First St', '47_ Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 

Прогресс

Некоторые потенциальные строительные блоки регулярного выражения включают в себя:
1. [0- 9] + для захвата чисел
2. X + для захвата Xs
3. ([0-9] +) (X +) для захвата групп

df['street']replace("[0-9]+)(X+)", value=r"\2", regex=True, inplace=False)

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

Ответы [ 3 ]

3 голосов
/ 09 января 2020

IIU C, это будет делать:

def repl(m):
    return m.group(1) + '_'*len(m.group(2))

df['street'].str.replace("^([0-9]+)(X*)", repl)

Вывод:

0     13__ First St
1     2___ First St
2    47_ Second Ave
Name: street, dtype: object
2 голосов
/ 09 января 2020

IIU C, мы можем передать функцию в аргумент repl так же, как re.sub

def repl(m):
    return '_' * len(m.group())

df['street'].str.replace(r'([X])+',repl)

out:

0     13__ First St
1     2___ First St
2    47_ Second Ave
Name: street, dtype: object

, если вам нужно сопоставить только после чисел, мы можем добавить '\d{1}', который будет совпадать только после одного экземпляра X

df['street'].str.replace(r'\d{1}([X]+)+',repl)
0 голосов
/ 09 января 2020

Предполагая, что 'X' встречается только в столбце 'улица'

streetresult=re.sub('X','_',str(df['street']))

Ваш желаемый результат должен быть результатом

Код, который я тестировал

import pandas as pd
import re

data = {'street':['13XX First St', '2XXX First St', '47X Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 
for  i in data:
    streetresult=re.sub('X','_',str(df['street']))
print(streetresult)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...