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

由于记忆错误,熊猫的替代品适用

  •  0
  • john  · 技术社区  · 6 年前

    我有一个希望应用于数据帧的函数:

    def DetermineMid(data, ts):
    
        if data['U'] == 0 and data['D'] > 0:
            mid = data['C'] + ts / 2
    
        elif data['U'] > 0 and data['D'] == 0:
            mid = data['C'] - ts / 2
    
        else:
            diff = data['A'] - data['B']
    
            if diff == 0:
                mid = data['C'] + 1
    
            else:
                mid = data['C']
    
        return mid
    

    我的df列是A、B、C、D、U。

    我的电话如下:

    df = df.apply(DetermineMid, args=(5, ), axis=1).
    

    在较小的数据帧上,这可以正常工作,但对于此数据帧:

    DatetimeIndex:2561527个条目, 2016-11-30 17:00:01至2017-11-29 16:00:00数据列(共6列 列):
    Z浮动64
    A浮动64
    B浮动64
    C浮动64
    U int64
    D int64
    数据类型:float64(5)、int64(2)
    内存使用:156.3 MB
    没有一个

    我收到了一份备忘录。我是否错误地使用了apply?我认为apply只是在行中迭代,并基于行值创建一个值mid,然后删除所有旧值,因为我不再关心它们了。

    有没有更好的方法?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Bharath M Shetty    6 年前

    使用 np.select

    m1= (df['U']==0) & (df['D']>0)
    
    m2 = (df['U']>0) & (df['D']==0)
    
    m3 = (df['A']-df['B'] == 0 )
    
    np.select([m1,m2,m3], [df['C']+ts/2, df['C']-ts/2, df['C']+1 ],df['C'])