由于MemoryError,大熊猫的替代品适用

时间:2018-01-02 13:19:56

标签: python pandas dataframe apply

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

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 float64
  一个float64
  B float64
  C float64
  U int64
  D int64
  dtypes:float64(5),int64(2)
  内存使用量:156.3 MB
  无

我收到MemoryError。我使用申请不正确吗?我认为apply只是遍历行并根据行值创建一个值mid,然后删除所有旧值,因为我不再关心它们了。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

使用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'])