在pandas dataframe中使用正则表达式匹配的组替换函数

Pet*_*r D 17 python pandas

我只是在学习python/pandas,就像它是多么强大和简洁.

在数据清理期间,我想在数据框中的列上使用regex替换,但我想重新插入部分匹配(组).

简单示例:lastname,firstname - > firstname lastname

我尝试了类似下面的内容(实际情况更复杂,所以请原谅简单的正则表达式):

df['Col1'].replace({'([A-Za-z])+, ([A-Za-z]+)' : '\2 \1'}, inplace=True, regex=True)
Run Code Online (Sandbox Code Playgroud)

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

Max*_*axU 16

我认为你对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
Run Code Online (Sandbox Code Playgroud)


piR*_*red 6

建立

df = pd.DataFrame(dict(name=['Smith, Sean']))
print(df)

          name
0  Smith, Sean
Run Code Online (Sandbox Code Playgroud)

运用 replace

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

0    Sean Smith
Name: name, dtype: object
Run Code Online (Sandbox Code Playgroud)

使用extract
拆分为两列

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

    Last First
0  Smith  Sean
Run Code Online (Sandbox Code Playgroud)