Панды заменяют с помощью словаря и регулярного выражения

#python #pandas

Вопрос:

Я хочу заменить следующее регулярное выражение:

 (?<!d)(d{2}-d{2})(?!d)
 

с определенной ценностью.

Например

 column = pd.Series(['01-01', '01-01 qwerasdf 0101-0101'])
 

Я хочу заменить все '01-01' на '0101'

(но никакие цифры до и после '01-01' этого '0101-0101' не останутся неизменными)

Я могу использовать следующее, чтобы получить то, что я хочу.

 column = column.str.replace(r'(?<!d)(d{2}-d{2})(?!d)', '0101', regex=True)
 

Но теперь у меня есть словарь, который нужно заменить на

 {'01-01': '0101', '01-02': '0102'...}
 

Как я могу использовать регулярное выражение и словарь одновременно в функции замены?

Ответ №1:

Используйте обратный вызов со словарем, если нет совпадения, возвращайте то же значение, что и для 05-07 with dict.get :

 column = pd.Series(['01-01', '01-01 qwerasdf 0101-0101', '01-02 aa', '05-07 dd'])

d = {'01-01': '0101', '01-02': '0102'}
column = column.str.replace(r'(?<!d)(d{2}-d{2})(?!d)', 
                            lambda x: d.get(x.group(), x.group()), 
                            regex=True)


print (column)
0                       0101
1    0101 qwerasdf 0101-0101
2                    0102 aa
3                   05-07 dd
dtype: object
 

Комментарии:

1. Я не совсем понимаю, что означает x.group ()? Это из модуля re?

2. @k07224115 — да, это для группы совпадений.