【问题标题】:conditionally Replace string in a Pandas series with another string有条件地将 Pandas 系列中的字符串替换为另一个字符串
【发布时间】:2018-08-31 15:49:06
【问题描述】:

以下面的例子为例。要替换一个特定列中的一个字符串,我已经这样做了,并且效果很好:

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
                   columns = ['key', 'data1', 'data2'])

  key  data1 data2
0   A      0    A1
1   B      1    B1
2   C      2    C1
3   A      3    A1
4   B      4    B1
5   C      5    C1



df['data2']= df['data2'].str.strip().str.replace("A1","Bad")

  key  data1 data2
0   A      0    Bad
1   B      1    B1
2   C      2    C1
3   A      3    Bad
4   B      4    B1
5   C      5    C1

Q(1) 如何有条件地替换一个字符串?这意味着,在data2 列中,我想替换A1,但只替换if "key==A" and "data1">1。我该怎么做?

Q(2) 条件替换能否应用于多次替换(即同时将A1 and A2替换为“Bad”但仅在相似条件下?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    我认为两边都需要过滤列,只替换过滤的行:

    mask = (df['key']=="A") &  (df['data1'] > 1)
    df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1","Bad")  
    
    print (df)
      key  data1 data2
    0   A      0    A1
    1   B      1    B1
    2   C      2    C1
    3   A      3   Bad
    4   B      4    B1
    5   C      5    C1
    

    如果需要多次替换,请使用replacedict

    df = pd.DataFrame({'key': ['A', 'A', 'C', 'A', 'B', 'C'],
                       'data1': range(6),
                       'data2': ['A1', 'A2', 'C1', 'A1', 'B1', 'C1']},
                       columns = ['key', 'data1', 'data2'])
    
    mask = (df['key']=="A") &  (df['data1'] > 0)
    df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().replace({"A1":"Bad", "A2":'Bad1'})  
    

    或者使用正则表达式:

    df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace(r'^A.*',"Bad")
    
    
    print (df)
      key  data1 data2
    0   A      0    A1
    1   A      1  Bad1
    2   C      2    C1
    3   A      3   Bad
    4   B      4    B1
    5   C      5    C1
    

    【讨论】:

      【解决方案2】:

      您可以使用numpy 和基于regex 的替换来覆盖A1, A2 等。如果我们扩展您的数据以包含A3 的示例:

      import pandas as pd
      import numpy as np
      
      df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C', 'A'],
                         'data1': range(7),
                         'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1', 'A3']},
                         columns=['key', 'data1', 'data2'])
      
      df['data2'] = np.where((df['key'] == 'A') & (df['data1'] > 1),
                             df['data2'].str.replace(r'A\d+','Bad'),
                             df['data2'])
      

      这会返回:

        key  data1 data2
      0   A      0    A1
      1   B      1    B1
      2   C      2    C1
      3   A      3   Bad
      4   B      4    B1
      5   C      5    C1
      6   A      6   Bad
      

      【讨论】:

        【解决方案3】:

        如果我们想以如下方式扩展上面的例子:

        df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                           'data1': range(6),
                           'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
                           columns = ['key', 'data1', 'data2'])  
        
        mask = (df['data1'] > 1)
        df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1",df['key']) 
        
          key  data1 data2
        0   A      0    A1
        1   B      1    B1
        2   C      2   NaN
        3   A      3   NaN
        4   B      4   NaN
        5   C      5   NaN
        

        我对我认为 data2 的内容将被列“key”的内容替换(在条件 data1>1 下)的答案感到非常惊讶。有什么想法吗?

        【讨论】:

        • 您需要df.loc[mask, 'data2']= df.loc[mask].apply(lambda x: x['data2'].strip().replace('A1', x['key']), axis=1) 吗?
        • @jezrael ..这正是我所需要的......谢谢你,再次感谢你......我试图将它应用到我的数据中,但我收到一条错误消息“raise IndexingError(' Unalignable boolean Series key provided') pandas.core.indexing.IndexingError: Unalignable boolean Series key provided"
        • 嗯,解决方案是一样的,只是数据被改变了?
        • 有时会帮助df.loc[mask.values, 'data2']= df.loc[mask.values],但没有很难知道的数据。
        猜你喜欢
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2019-06-06
        • 2012-07-16
        • 2014-12-23
        • 2021-10-27
        • 2015-06-27
        相关资源
        最近更新 更多