我有一个函数,给定一个值,返回一个大小为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。
答案 0 :(得分:0)
我想我可能找到了解决问题的方法。这似乎使用更少的内存,非常快,并保持索引像apply
那样:
pd.DataFrame(np.vstack(map(process, s)), index=s.index)