Python 在dataframe replace函数中使用正则表达式匹配组

Python 在dataframe replace函数中使用正则表达式匹配组,python,pandas,Python,Pandas,我只是在学习python/pandas,喜欢它的强大和简洁 在数据清理期间,我希望使用regex对数据帧中的列使用replace,但我希望重新插入部分匹配(组) 简单的例子: lastname,firstname->firstname lastname 我尝试了以下方法(实际情况更复杂,请原谅简单的正则表达式): 但是,这会导致空值。匹配部分按预期工作,但值部分不工作。 我想这可以通过一些拆分和合并来实现,但我正在寻找一个关于regex组是否可以用于replace的一般答案。设置 使用替换 df

我只是在学习python/pandas,喜欢它的强大和简洁

在数据清理期间,我希望使用regex对数据帧中的列使用replace,但我希望重新插入部分匹配(组)

简单的例子: lastname,firstname->firstname lastname

我尝试了以下方法(实际情况更复杂,请原谅简单的正则表达式):

但是,这会导致空值。匹配部分按预期工作,但值部分不工作。 我想这可以通过一些拆分和合并来实现,但我正在寻找一个关于regex组是否可以用于replace的一般答案。

设置

使用
替换

df.name.str.replace(r'(\w+),\s*(\w+)', r'\2 \1')

0    Sean Smith
Name: name, dtype: object
使用
提取

分成两列

df.name.str.extract('(?P<Last>\w+),\s*(?P<First>\w+)', expand=True)

    Last First
0  Smith  Sean
df.name.str.extract('(?P\w+)\s*(?P\w+),expand=True)
最后优先
0史密斯·肖恩

我认为您对正则表达式有一些问题

As使用
'\\2\\1'
或更好的
r'\2\1'
,As
'\1'
是ASCII码
1

如果您使用正确的正则表达式,您的解决方案应该有效:

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

请分享一些测试数据。或者
df['Col1']。替换({'([A-Za-z]+),([A-Za-z]+):'\\2\\1'},inplace=True,regex=True)
。真的很棒!也只是学习python,所以请原谅新手的错误。附加问题:双向广播,即两者都快吗?通过.str的和直接使用replace()的都快吗?@PeterD,
df.column.str.replace()
-应该比
df.column.replace({})
快一点,但是第二种方法让您可以在一个goThanks中进行一些替换,以获取有关extract()的额外信息,皮尔斯平方。我在MaxU的答案上做了标记,以获得关于我在正则表达式中的新手错误的额外提示。@PeterD没问题。MaxU的答案是greatThanks,特别是对于python正则表达式的工作原理,我看到的大多数示例都非常简单,似乎可以省略r语法而不会出现问题。
df.name.str.extract('(?P<Last>\w+),\s*(?P<First>\w+)', expand=True)

    Last First
0  Smith  Sean
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