Pandas 熊猫“应用”到多个占用大量内存的列中

Pandas 熊猫“应用”到多个占用大量内存的列中,pandas,Pandas,我有一个函数,给定一个值,它返回一个大小为100的numpy数组。我想将其应用于一个系列,并从中创建一个数据帧,每个列在函数返回的数组中的不同位置。这对熊猫来说很容易: 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(la

我有一个函数,给定一个值,它返回一个大小为100的numpy数组。我想将其应用于一个系列,并从中创建一个数据帧,每个列在函数返回的数组中的不同位置。这对熊猫来说很容易:

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。

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

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

有没有理由不直接使用
df=pd.DataFrame(np.random.randn(2700000,100))
或者这只是一个关于内存消耗的示例问题?上面的
过程
函数只是实际函数的占位符。真正的函数不仅仅是
np.random.rand(100)
。布局上的区别在于,将类似数组的东西(如np数组或列表)返回到一个使用索引构成列的序列之间存在语义上的差异,这可能是一个性能缺陷,或者当使用
apply
时,它无法计算出结果df的大小。你使用的是什么版本的numpy和pandas?pandas是0.17.1,numpy是1.9.2。这可能值得作为一个问题发布