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


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

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

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

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

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

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


5857
2018-01-04 20:47


起源

请分享一些数据进行测试。 - Abdou
要么 df['Col1'].replace({'([A-Za-z]+), ([A-Za-z]+)' : '\\2 \\1'}, inplace=True, regex=True)。 - Abdou
非常好!刚刚学习python,请原谅新手的错误。附加问题:两种方式广播,即两者都是快速的,一个是通过.str和一个直接使用replace()? - Peter D
@PeterD, df.column.str.replace()  - 相比之下应该更快一点 df.column.replace({}),但是第二个让你一次性做一些替换 - MaxU


答案:


我认为您对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

9
2018-01-04 20:59



谢谢,特别是对于python正则表达式如何工作的很好的解释,我看到的大多数例子都是如此简单,它们可以省略r语法而没有问题,似乎。 - Peter D


建立

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

6
2018-01-04 20:53



感谢extract(),piRSquared的额外信息。我通过MaxU标记了答案,以获得有关正则表达式的新手错误的额外提示。 - Peter D
@PeterD没问题。 MaxU的答案很棒 - piRSquared