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

使用放置多个条件np.哪里关于蟒蛇熊猫?

  •  2
  • Yog  · 技术社区  · 6 年前

    我有以下数据帧:

    load = pd.DataFrame({'A':list('abcdef'),
                       'B':[4,5,4,5,5,4],
                       'C':[7,8,9,4,2,0],
                       'D':[1,3,5,4,2,0],
                       'E':[5,3,6,9,2,4],
                       'F':list('aaabbb')})
    

    我需要支票 b>c 哪里 c=d 两者都有 c,d!=0

    输出

    False
    False
    False
    True
    True
    False
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   giser_yugang    6 年前

    尝试:

    load['print'] = load.apply(lambda x:(x.B>x.C)&(x.C==x.D)&(x.C!=0)&(x.D!=0),axis=1)
       A  B  C  D  E  F  print
    0  a  4  7  1  5  a  False
    1  b  5  8  3  3  a  False
    2  c  4  9  5  6  a  False
    3  d  5  4  4  9  b   True
    4  e  5  2  2  2  b   True
    5  f  4  0  0  4  b  False
    

    load['print'] = np.where((load.B>load.C)&(load.C==load.D)&(load.C!=0)&(load.D!=0),True, False)
    
        2
  •  1
  •   jezrael    6 年前

    & 对于 bitwise AND :

    m = load.B.gt(load.C) & load.C.eq(load.D) & load[['C','D']].ne(0).any(axis=1)
    #alternative
    m = load.B.gt(load.C) & load.C.eq(load.D) & load['C'].ne(0) & load['D'].ne(0)
    
    print (m)
    0    False
    1    False
    2    False
    3     True
    4     True
    5    False
    dtype: bool
    

    numpy.where 获得相同的输出:

    load['new'] = np.where(m, True, False)
    print (load)
       A  B  C  D  E  F    new
    0  a  4  7  1  5  a  False
    1  b  5  8  3  3  a  False
    2  c  4  9  5  6  a  False
    3  d  5  4  4  9  b   True
    4  e  5  2  2  2  b   True
    5  f  4  0  0  4  b  False
    

    如果需要按如下条件设置2个值,则使用此选项:

    load['new'] = np.where(m, 10, 20)
    print (load)
       A  B  C  D  E  F  new
    0  a  4  7  1  5  a   20
    1  b  5  8  3  3  a   20
    2  c  4  9  5  6  a   20
    3  d  5  4  4  9  b   10
    4  e  5  2  2  2  b   10
    5  f  4  0  0  4  b   20
    

    性能

    load = pd.concat([load] * 1000, ignore_index=True)
    
    In [106]: %timeit load['print'] = load.apply(lambda x:(x.B>x.C)&(x.C==x.D)&(x.C!=0)&(x.D!=0),axis=1)
    408 ms ± 13.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [107]: %timeit load['print'] = load.B.gt(load.C) & load.C.eq(load.D) & load['C'].ne(0) & load['D'].ne(0)
    1.64 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
        3
  •  0
  •   jpp    6 年前

    你可以用 np.logical_and.reduce

    m1 = load['B'] > load['C']
    m2 = load['C'] == load['D']
    m3 = load['C'] != 0
    m4 = load['D'] != 0
    
    res = load[np.logical_and.reduce((m1, m2, m3, m4))]
    
    print(res)
    
       A  B  C  D  E  F
    3  d  5  4  4  9  b
    4  e  5  2  2  2  b