web-dev-qa-db-ja.com

パンダ:データフレームのサブインデックス:コピーとビュー

データフレームがあるとしましょう

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

そして、データのサブセットから別のデータフレームを作成します。

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

barfooからのそれらの要素のコピーを保持しますか?代わりに、そのデータのviewを作成する方法はありますか?もしそうなら、このビューのデータを変更しようとするとどうなりますか? Pandasはなんらかの種類の コピーオンライト メカニズムを提供しますか?

24

あなたの答えはpandas docs: returning-a-view-versus-a-copy にあります。

ラベルの配列またはブールベクトルがインデックス作成操作に関係している場合は常に、結果はコピーになります。単一のラベル/スカラーのインデックス作成とスライスを使用します。 df.ix [3:6]またはdf.ix [:、 'A']、ビューが返されます

あなたの例では、barfooのスライスのviewです。 copyが必要な場合は、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
33
davidshinn