代码之家  ›  专栏  ›  技术社区  ›  SBad

有条件地用另一个字符串替换Pandas系列中的字符串

  •  1
  • SBad  · 技术社区  · 7 年前

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

    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
    

    问题(1)我们如何有条件地替换一个字符串?意思是,在列中 data2 ,我想替换 A1 但仅限于 if "key==A" and "data1">1 。我该怎么做?

    Q(2)有条件替换是否适用于多次替换(即替换 A1 and A2 在“坏”的同时,但只有在类似的条件下?

    3 回复  |  直到 7 年前
        1
  •  3
  •   asongtoruin    7 年前

    您可以使用 numpy 和a 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
    
        2
  •  2
  •   jezrael    7 年前

    我认为两边都需要filter列,只替换已筛选行:

    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
    

    如果需要多次更换使用 replace 具有 dict :

    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'})  
    

    或使用regex:

    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
    
        3
  •  0
  •   SBad    7 年前

    如果我们想以以下方式扩展上述示例:

    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下)。有什么想法吗?