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

时间:2015-10-02 07:59:19

标签: pandas replace substring dataframe

我正在使用包含名为" raw_parameter_name"的列的数据框。在此列中,我有不同的字符串值。几个值类似于以下模式" ABCD; MEAN"。 我想要做的是取代每个值" ABCD; MEAN"用" ABCD; X-BAR"。子串" ABCD"可能会有所不同,但模式&#34 ;;意思"是不变的我想要替换。使用"替换"来查看不同的选项。方法,但不知道如何只替换子字符串而不是整个字符串。请指教。 提前谢谢

3 个答案:

答案 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