Многочисленные замены регулярных выражений пандами - PullRequest
0 голосов
/ 05 января 2019

У меня есть ряд панд разных возрастных диапазонов:

s = pd.Series([14,1524,2534,3544,65])

Я бы хотел создать новую серию, подобную этой:

0     0-14
1    15-24
2    25-34
3    35-44
4      65+

Я могу сделать это, используя отображение:

s = pd.Series([14,1524,2534,3544,65])
age_map = {
    14: '0-14',
    1524: '15-24',
    2534: '25-34',
    3544: '35-44',
    4554: '45-54',
    5564: '55-64',
    65: '65+'
}
s.map(age_map)

Также, используя несколько регулярных выражений:

s = pd.Series([14,1524,2534,3544,65])
s = s.astype(str).str.replace(r'(\d\d)(\d\d)', r'\1-\2',regex=True)
s = s.astype(str).str.replace(r'14', r'0-14',regex=True)
s = s.astype(str).str.replace(r'65', r'65+',regex=True)
s

Вопрос
Можем ли мы объединить все три регулярных выражения в одно расширенное регулярное выражение и получить тот же результат?

что-то вроде:

s = pd.Series([14,1524,2534,3544,65])
pat = ''
pat_sub = ''
s = s.astype(str).str.replace(pat, pat_sub,regex=True)
s

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Мне понравился ответ @coldspeed, который является более гибким и многократно используемым.

Однако я придумал операцию с цепями панд так:

s = s.astype(str).str.replace(r'14', r'0-14',regex=True)
                 .str.replace(r'65', r'65+',regex=True)
                 .str.replace(r'(\d\d)(\d\d)', r'\1-\2',regex=True))

s
0 голосов
/ 05 января 2019

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

def parse_str(match):
    a, b = match.groups()
    if not b:
        return f'0-{a}' if a == '14' else f'{a}+'    
    return f'{a}-{b}'

s.astype(str).str.replace(r'(\d{2})(\d{2})?', parse_str)

0     0-14
1    15-24
2    25-34
3    35-44
4      65+
dtype: object

Это должно работать, если ваша серия содержит только две или четыре цифры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...