PD.DataFrame.assign(x=series) 没有深度拷贝



向数据帧添加列并生成新数据帧但不复制整个数据的最有效方法是什么?看看熊猫的实现。DataFrame.assign:

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

我正在开发一个使用 pandas 的生产系统,我想最大限度地减少内存使用(我们的数据帧运行 ~500Mb,尽管主要由 memmap ndarray 支持)。以上在内存(和时间)中看起来很慢。~10 个上述深度拷贝不必要地将完整数据引入 RAM 并导致交换。 一般来说,我们不应该需要超过 500Mb + 小索引,但像这样的副本会杀死我们的服务器。

这是一种方法:

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

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

最新更新