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

在每行中应用逻辑比应用lambda更快吗?

  •  2
  • William  · 技术社区  · 4 年前

    我有一个df:

    dfs = """
        contract Valindex0  RB  Valindex1
    2   A00118  51  0   50
    3   A00118  42  1   47
    4   A00118  44  1   47
    
    """
    df = pd.read_csv(StringIO(dfs.strip()), sep='\s+')
    

      contract  Valindex0  RB  Valindex1
    2   A00118         51   0         50
    3   A00118         42   1         47
    4   A00118         44   1         47
    

    我想在df['Valindex']的每一行中添加一个新列,

     df['Valindex0']
    

     df['Valindex1']
    

    这取决于df['RB']:

    if df['RB']==0:
       df['Valindex'] = df['Valindex0']
    elif df['RB']==1:
      df['Valindex'] = df['Valindex1']  
    

    现在我正在使用apply lambda,但速度非常慢:

    df['Valindex'] = df.apply(
        lambda df: df["Valindex" + str(df["RB"])], axis=1)
    

    输出应如下所示:

        contract    Valindex0   RB  Valindex1   Valindex
    2   A00118            51    0   50          51
    3   A00118            42    1   47          47
    4   A00118            44    1   47          47
    

    4 回复  |  直到 4 年前
        1
  •  6
  •   Ch3steR    4 年前

    使用 np.where()

    df["Valindex"] = np.where(df["RB"].eq(0), df["Valindex0"], df["Valindex1"])
    

    np.select()

    conditions = [df["RB"].eq(0), df["RB"].eq(1)]
    labels = [df["Valindex0"], df["Valindex1"]]
    df["Valindex"] = np.select(conditions, labels)
    

    产量 df

        contract    Valindex0   RB  Valindex1   Valindex
    2   A00118      51          0   50          51
    3   A00118      42          1   47          47
    4   A00118      44          1   47          47
    
        2
  •  3
  •   Ch3steR    4 年前

    你可以试试 Series.where

    df["Valindex"] = df["Valindex0"].where(df["RB"].eq(0), df["Valindex1"])
    
    
      contract  Valindex0  RB  Valindex1  Valindex
    2   A00118         51   0         50        51
    3   A00118         42   1         47        47
    4   A00118         44   1         47        47
    
        3
  •  1
  •   BENY    4 年前

    让我们试试看

    df['Valindex'] = df['Valindex0']
    
    df.loc[df.RB==1,'Valindex'] = df['Valindex1']
    
        4
  •  1
  •   Daniel Redgate    4 年前

    运行一组方法并在1000行上对每个方法计时,似乎Anurag建议的方法3效果最好。每次跑步的时间会有所不同,但排名不会改变。

    #Method 1 (original) - 0.0168s
    df['Valindex'] = df.apply(lambda df: df["Valindex" + str(df["RB"])], axis=1)
    
    #Method 2 - 0.0015s
    df['Valindex'] = (df['RB'] == 0 ) * df['Valindex0'] + df['RB'] * df['Valindex1']
    
    #Method 3 - 0.0009s
    df["Valindex"] = np.where(df["RB"].eq(0), df["Valindex0"], df["Valindex1"])
    
    #Method 4 - 0.0014s
    df["Valindex"] = df["Valindex0"].where(df["RB"].eq(0), df["Valindex1"])
    
    #Method 5 - 0.0022s
    df['Valindex'] = df['Valindex0']
    df.loc[df.RB==1,'Valindex'] = df['Valindex1']