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

熊猫群比;if条件:sum else:基于另一列的给定列的最大值

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

    df 我做一个团购 group

    df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
    df['group'] = [0, 0, 1, 1]
    

    然后我需要B的min()和其他对其余列的各种操作。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    where :

    np.random.seed(15)
    N = 1000
    df = pd.DataFrame(np.random.rand(N,10), columns=list('abcdefghij'))
    df['group'] = np.random.randint(100, size=N)
    
    df_grouped = df.groupby('group')
    s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
    print (s1)
    
    df_grouped = df.groupby('group')
    s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
    print (s2)
    
    
    In [69]: %%timeit
        ...: df_grouped = df.groupby('group')
        ...: s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
        ...: 
    24.8 ms ± 228 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    In [70]: %%timeit
        ...: df_grouped = df.groupby('group')
        ...: s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
        ...: 
    1.63 ms ± 58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
        2
  •  0
  •   conv3d    7 年前

    我是和你一起想出来的 apply :

    df_grouped = df.groupby('group')
    df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
    
    group
    0    0.834666
    1    1.096652
    dtype: float64