2016-06-15 9 views
4

パンダオブジェクトcopy()の方法がオブジェクトを再構成するよりもはるかに遅いように見える理由は誰にも分かりますか?標準コンストラクタに対してcopy()メソッドを使用する理由はありますか?パンダオブジェクトとコピーの再構築

In [42]: import pandas as pd 

In [43]: df = pd.DataFrame(np.random.rand(300000).reshape(100000,3), columns=list('ABC')) 

In [44]: %timeit pd.DataFrame(df) 
The slowest run took 5.61 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 3.95 µs per loop 

In [45]: %timeit df.copy() 
The slowest run took 5.44 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 390 µs per loop 

コピー操作の間に不一致が同様にシリーズをパンダために引き継がれる:ここで

は、迅速な結果です。 興味深いことに、numpyの配列は、例えば、行動の同じタイプを示さない:

In [48]: import numpy as np 

In [49]: myarray = np.random.rand(300000) 

In [50]: %timeit myarray.copy() 
10000 loops, best of 3: 162 µs per loop 

In [52]: %timeit np.array(myarray) 
10000 loops, best of 3: 168 µs per loop 

答えて

3

コンストラクタを使用すると、ちょうど同じ1を指しながらコピーは、実際に、データフレームの新しい内部表現を作成するためにです:

In [11]: df = pd.DataFrame([[1, 2], [3, 4]], columns=["A", "B"]) 

In [12]: id(df._data) # internal attribute, don't futz with it! 
Out[12]: 4472136472 

In [13]: df1 = df.copy() 

In [14]: id(df1._data) # different object 
Out[14]: 4472572448 

In [15]: df2 = pd.DataFrame(df) 

In [16]: id(df2._data) # same as df._data 
Out[16]: 4472136472 

当然の結果では、元データフレームを変異させた場合、それはDF2が、DF1ない(コピー)を変更しますということです。

In [21]: df.iloc[0, 0] = 99 

In [22]: df 
Out[22]: 
    A B 
0 99 2 
1 3 4 

In [23]: df1 
Out[23]: 
    A B 
0 1 2 
1 3 4 

In [24]: df2 
Out[24]: 
    A B 
0 99 2 
1 3 4 

これはあなたがコピーを使用したい理由です!

In [31]: a = np.array([1, 2]) 

In [32]: a1 = a.copy() 

In [33]: a2 = np.array(a) 

In [34]: a[0] = 99 

In [35]: a1 
Out[35]: array([1, 2]) 

In [36]: a2 
Out[36]: array([1, 2]) 
:numpyのコピーとコンストラクタの両方がコピーを作成するには


関連する問題