【问题标题】:Alternatives to pandas apply due to MemoryError由于 MemoryError,pandas 的替代方案适用
【发布时间】:2018-06-12 04:59:12
【问题描述】:

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

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
数据类型:float64(5)、int64(2)
内存使用量:156.3 MB

我收到 MemoryError。我是否错误地使用了应用程序?我原以为 apply 只是遍历行并根据行值创建一个中间值,然后删除所有旧值,因为我不再关心它们了。

有更好的方法吗?

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

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

    【讨论】:

    • 太完美了!谢谢!只是快速跟进:1)你怎么知道使用 numpy 而不是 pandas 应用? 2)如果我想保留原始值并为这些值创建一个新列,我是否应该做同样的事情,然后将两者连接起来?
    • 是的,您可以使用它创建一个新列,并且需要一些时间来理解矢量化解决方案的概念,给它一些时间
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2012-05-22
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多