Использование регулярных выражений в pandas функции замены фреймов
Я просто изучаю python/ pandas и люблю как мощный и лаконичный.
Во время очистки данных я хочу использовать замену в столбце в фрейме данных с регулярным выражением, но я хочу повторно вставить части матча (группы).
Простой пример:
lastname, firstname → firstname lastname
Я попробовал что-то вроде следующего (реальный случай более сложный, поэтому извините простое регулярное выражение):
df['Col1'].replace({'([A-Za-z])+, ([A-Za-z]+)' : '\2 \1'}, inplace=True, regex=True)
Однако это приводит к пустым значениям. Партия матча работает так, как ожидалось, но часть значения не работает.
Я предполагаю, что это может быть достигнуто путем разделения и слияния, но я ищу общий ответ о том, можно ли заменить группу регулярных выражений на замену.
Ответы
Ответ 1
Я думаю, что у вас есть несколько проблем с RegEx.
Как @Abdou только что сказал, используйте либо '\\2 \\1'
, либо лучше r'\2 \1'
, так как '\1'
- это символ с кодом ASCII 1
Ваше решение должно работать, если вы будете использовать правильные RegEx:
In [193]: df
Out[193]:
name
0 John, Doe
1 Max, Mustermann
In [194]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1'}, regex=True)
Out[194]:
0 Doe John
1 Mustermann Max
Name: name, dtype: object
In [195]: df.name.replace({r'(\w+),\s+(\w+)' : r'\2 \1', 'Max':'Fritz'}, regex=True)
Out[195]:
0 Doe John
1 Mustermann Fritz
Name: name, dtype: object
Ответ 2
Настройка
df = pd.DataFrame(dict(name=['Smith, Sean']))
print(df)
name
0 Smith, Sean
с помощью replace
df.name.str.replace(r'(\w+),\s*(\w+)', r'\2 \1')
0 Sean Smith
Name: name, dtype: object
с помощью extract
разделен на два столбца
df.name.str.extract('(?P<Last>\w+),\s*(?P<First>\w+)', expand=True)
Last First
0 Smith Sean