2017-10-10 5 views
0

DataFrameに列を追加して新しいDataFrameを生成するのに、データ全体をコピーするのではなく、最も効率的な方法は何ですか? pandas.DataFrame.assignの実装を見てみる:pd.DataFrame.assign(x = series)ディープコピーなし

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

私はパンダを使用する生産システムに取り組んでいると私はメモリ使用を最小限に抑えたい(主にmemmapped ndarraysが付いていますが、私たちのデータフレームが〜500MBを実行します) 。上記はメモリ(AND時間)が非常に遅く見えます。 〜上記のように10個のディープコピーは、不必要にすべてのデータをRAMに持ち込み、スワッピングにつながります。一般的に、500Mb以上の小さなインデックスは必要ありませんが、このようなコピーは私たちのサーバーを殺します。ここで

+1

"_yield a new 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 

それが不一致インデックスの場合を処理しないので、私はあまりそれを好きではありません。

関連する問題