【问题标题】:replace substring in pandas data frame column替换熊猫数据框列中的子字符串
【发布时间】:2015-10-02 07:59:18
【问题描述】:

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

【问题讨论】:

    标签: pandas replace substring dataframe


    【解决方案1】:

    使用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
    

    时间

    对于 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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        您不必像上面标记为正确的示例中那样使用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
        

        【讨论】:

          猜你喜欢
          • 2022-07-27
          • 2021-09-07
          • 2022-10-13
          • 2018-09-24
          • 2018-02-11
          • 2018-08-01
          • 2017-09-09
          • 2017-07-08
          相关资源
          最近更新 更多