pd.DataFrame.assign(x =系列)没有深层复制

时间:2017-10-10 00:57:01

标签: pandas

将列添加到DataFrame并生成新的DataFrame,但不复制整个数据的最有效方法是什么?看看pandas.DataFrame.assign的实现:

class DataFrame()
    def assign(self, **kwargs):
        data = self.copy() # deep=True is the default!
        ...

我正在使用一个使用pandas的生产系统,我希望最大限度地减少内存使用(我们的数据帧运行~500Mb,尽管主要由memmapped ndarrays支持)。上面的内存看起来很慢(和时间)。 如上所述~10个深拷贝不必要地将完整数据带入RAM并导致交换。通常,我们不需要超过500Mb +小索引,但这样的副本会杀死我们的服务器。

1 个答案:

答案 0 :(得分:0)

以这种方式:

import numpy as np
import pandas as pd

def pd_sensible_assign(df, **kwargs):
    def gen():
        for c in df.columns: yield c.name,c
        for k,v in kwargs.iteritems(): yield k,v
    return pd.DataFrame(gen(), index=df.index, copy=False)

x = np.arange(0,10,0.1)
b=np.zeros(len(x), dtype=float)
X = pd.DataFrame({"x":x}, copy=False)

print X.shape, X.dtypes
X = pd_sensible_assign(X, b=b)
print X.shape, X.dtypes

我不喜欢它,因为它没有处理不匹配索引的情况。