2017-10-10 20 views
0

向DataFrame添加列併產生新的DataFrame,但不復制整個數據的最有效方法是什麼?綜觀pandas.DataFrame.assign的實現:pd.DataFrame.assign(x = series)without deep copy

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

我正在使用熊貓生產系統,我想(雖然由memmapped ndarrays大多是支持我們的dataframes運行〜500 MB),以儘量減少內存使用。上面看起來很慢(AND時間)。 如上所述的深度拷貝不必要地將全部數據帶入RAM並導致交換。通常,我們不應該需要超過500Mb +的小型索引,但是像這樣的副本會殺死我們的服務器。

+1

所以通過「_yield一個新的DataFrame_」你真的意味着有一個DataFrame共享內存的每一列,除了新的DataFrame的新的? – miradulo

+0

是的 - 我只是想要一個數據幀對象有已分配的列,加上對原始列的引用。 – user48956

回答

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 

我不喜歡它多,因爲它不處理不匹配的索引的情況下。