Использование регулярных выражений в 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