替换 pandas 数据框列中的子字符串

replace substring in pandas data frame column

我正在使用包含名为 "raw_parameter_name" 的列的数据框。在本专栏中,我有不同的字符串值。几个值类似于以下模式 "ABCD;MEAN"。 我想要做的是将每个值 "ABCD;MEAN" 替换为 "ABCD;X-BAR"。子字符串 "ABCD" 可能会有所不同,但模式“;MEAN”是我想要替换的常量。使用 "replace" 方法查看了不同的选项,但不知道如何只替换子字符串而不是整个字符串。请指教。 提前谢谢你

使用 str.contains to create a boolean index to mask the series and then str.replace 替换您的子字符串:

In [172]:
df = pd.DataFrame({'raw_parameter_name':['ABCD;MEAN', 'EFGH;MEAN', '1234;MEAN', 'sdasd;MEAT']})
df

Out[172]:
  raw_parameter_name
0          ABCD;MEAN
1          EFGH;MEAN
2          1234;MEAN
3         sdasd;MEAT

In [173]:
df.loc[df['raw_parameter_name'].str.contains(';MEAN$'), 'raw_parameter_name'] = df['raw_parameter_name'].str.replace('MEAN', 'X-BAR')
df

Out[173]:
  raw_parameter_name
0           ABCD;X-BAR
1           EFGH;X-BAR
2           1234;X-BAR
3         sdasd;MEAT

这里它匹配子字符串 ';MEAN' 存在的地方 $ 是一个终止符号

布尔掩码如下所示:

In [176]:
df['raw_parameter_name'].str.contains(';MEAN$')

Out[176]:
0     True
1     True
2     True
3    False
Name: raw_parameter_name, dtype: bool

计时

对于 40,0000 行 df 使用 str.replace 比使用 apply 更快:

In [183]:
import re
%timeit df['raw_parameter_name'].apply(lambda x: re.sub(';MEAN$',';X-BAR',x))
%timeit df['raw_parameter_name'].str.replace('MEAN', 'X-BAR')
​
1 loops, best of 3: 1.01 s per loop
1 loops, best of 3: 687 ms per loop

您可以使用正则表达式模块 re 例如:

import pandas as pd
import re

df = pd.DataFrame({"row_parameter_name":['abcd;MEAN','Dogg11;MEAN',';MEAN']})

Out[126]:
  row_parameter_name
0          abcd;MEAN
1        Dogg11;MEAN
2              ;MEAN 

df['row_parameter_name'] = df['row_parameter_name'].apply(lambda x: re.sub(';MEAN$',';X-BAR',x))

In [128]: df
Out[128]:
  row_parameter_name
0         abcd;X-BAR
1       Dogg11;X-BAR
2             ;X-BAR

您不必像上面标记为正确的示例那样使用 re。在某个时间点可能有必要,但这不再是最好的答案。

也不需要先用str.contains()

而是使用 .str.replace() 进行适当的匹配和替换。

In [2]: df = pd.DataFrame({"row_parameter_name":['abcd;MEAN','Nothing;NICE','Dogg11;MEAN',';MEAN','MEANY-MEANY;MEAN']})

In [3]: df
Out[3]: row_parameter_name
        0   abcd;MEAN
        1   Nothing;NICE
        2   Dogg11;MEAN
        3   ;MEAN
        4   MEANY-MEANY;MEAN

In [4]: df.row_parameter_name.str.replace("MEAN$","X-BAR")
Out[4]: 0           abcd;X-BAR
        1         Nothing;NICE
        2         Dogg11;X-BAR
        3               ;X-BAR
        4    MEANY-MEANY;X-BAR
        Name: row_parameter_name, dtype: object