2013-07-31 5 views
15

対コピーは、私がデータフレームパンダ:副指標データフレーム:ビュー

import pandas as pd 
import numpy as np 
foo = pd.DataFrame(np.random.random((10,5))) 

を持っていると私は私のデータのサブセットから別のデータフレームを作成言ってやるがいい。

bar = foo.iloc[3:5,1:4] 

barは、これらの要素のコピーを保持しませんfoo?代わりにそのデータのviewを作成する方法はありますか?もしそうなら、このビューでデータを修正しようとするとどうなりますか?パンダはどんな種類のcopy-on-writeメカニズムを提供しますか?

+0

をので、私は、[:, [ 'A'、 'B']]それはコピーを返しますが、bar.locを行うとき、私はbar.locを行うとき[:、 'a']ビューを返しますか? – Lisa

答えて

21

あなたの答えはパンダドキュメントにあります:returning-a-view-versus-a-copyラベルの配列またはブールベクトルは、インデックス操作で 関与しているときはいつでも

結果は、コピーになります。 単一ラベル/スカラーインデックスとスライスでは、 など。 df.ix [3:6]またはdf.ix [:, 'A']、 ビューはに返されます。あなたの例では

barfooのスライスのビューです。 コピーが必要な場合は、copyメソッドを使用できました。 barを変更すると、fooも変更されます。 pandasはコピーオンライトメカニズムを持っていないようです。

は説明するために以下の私のコード例を参照してください。

In [1]: import pandas as pd 
    ...: import numpy as np 
    ...: foo = pd.DataFrame(np.random.random((10,5))) 
    ...: 

In [2]: pd.__version__ 
Out[2]: '0.12.0.dev-35312e4' 

In [3]: np.__version__ 
Out[3]: '1.7.1' 

In [4]: # DataFrame has copy method 
    ...: foo_copy = foo.copy() 

In [5]: bar = foo.iloc[3:5,1:4] 

In [6]: bar == foo.iloc[3:5,1:4] == foo_copy.iloc[3:5,1:4] 
Out[6]: 
     1  2  3 
3 True True True 
4 True True True 

In [7]: # Changing the view 
    ...: bar.ix[3,1] = 5 

In [8]: # View and DataFrame still equal 
    ...: bar == foo.iloc[3:5,1:4] 
Out[8]: 
     1  2  3 
3 True True True 
4 True True True 

In [9]: # It is now different from a copy of original 
    ...: bar == foo_copy.iloc[3:5,1:4] 
Out[9]: 
     1  2  3 
3 False True True 
4 True True True 
+0

bar.loc [:, ['a'、 'b']]を実行するとコピーが返されますが、bar.loc [:, 'a']を実行するとビューが返されますか? – Lisa

+0

bar.loc [:, 'a']はスライスのように動作し、コピーを返すリストインデックスを使用するビューbar.loc [:, ['a'、 'b']]を返します。 bar.loc [:, ['a']]はコピーも返します。 – davidshinn

+0

バー['a']はどうですか?それは眺めかコピーか? – Lisa

関連する問題