我正在使用包含名为" raw_parameter_name"的列的数据框。在此列中,我有不同的字符串值。几个值类似于以下模式" ABCD; MEAN"。 我想要做的是取代每个值" ABCD; MEAN"用" ABCD; X-BAR"。子串" ABCD"可能会有所不同,但模式&#34 ;;意思"是不变的我想要替换。使用"替换"来查看不同的选项。方法,但不知道如何只替换子字符串而不是整个字符串。请指教。 提前谢谢
答案 0 :(得分:3)
使用str.contains
创建一个布尔索引来掩盖该系列,然后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
<强>计时强>
对于使用str.replace
的40,000行df比使用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
答案 1 :(得分:2)
您可以使用正则表达式模块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
答案 2 :(得分:0)
您不必像上面标记正确的示例中那样使用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