Pandas中的`apply`应用于多列,消耗大量内存

4

我有一个函数,给定一个值,返回大小为100的numpy数组。我想将其应用于一个序列,创建一个数据帧,每一列都是函数返回的数组中不同位置的值。使用Pandas很容易实现:

import numpy as np
import pandas as pd

# placeholder for real function
def process(x):
    return np.random.rand(100)

s = pd.Series(range(2700000))
df = s.apply(lambda x: pd.Series(process(x)))

不幸的是,这会消耗大量的RAM。它至少消耗16GB,并在我的计算机上开始交换内存,我最终必须在只有一半内存的计算机上运行此代码。

如果我改为写s.apply(lambda x: process(x)),它不会消耗那么多内存,但这并不能得到我想要的布局。有没有一种方法可以在不消耗大量RAM的情况下完成这个任务?

我正在使用Pandas 0.17.1和Numpy 1.9.2。


你为什么不直接使用 df = pd.DataFrame(np.random.randn(2700000, 100)),这样做有什么原因吗?或者这只是关于内存消耗的一些示例问题吗? - EdChum
上面的 process 函数只是真实函数的占位符。真实函数不仅仅是 np.random.rand(100) - Mike Pedersen
布局差异在于,返回类似于 np 数组或列表的仅类似数组的东西与返回 Series 之间存在语义差异。对于 Series,索引用于形成列,这可能是性能 Bug,或者当使用 apply 时,无法确定结果 df 的大小。您正在使用哪个版本的 numpy 和 pandas? - EdChum
Pandas 是 0.17.1 版本,numpy 是 1.9.2 版本。 - Mike Pedersen
这可能值得在 https://github.com/pydata/pandas/issues 上发布一个问题。 - EdChum
我已经开始这样做了:https://github.com/pydata/pandas/issues/12584。如果有人能找到解决方法,我仍然非常感激。 - Mike Pedersen
1个回答

0

我想我可能已经找到了解决我的问题的方法。这个方法似乎使用的内存更少,速度也很快,并且像apply一样保持索引:

pd.DataFrame(np.vstack(map(process, s)), index=s.index)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接