替换 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
我正在使用包含名为 "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