データフレームがあるとしましょう
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
を作成する方法はありますか?もしそうなら、このビューのデータを変更しようとするとどうなりますか? Pandasはなんらかの種類の コピーオンライト メカニズムを提供しますか?
あなたの答えはpandas docs: returning-a-view-versus-a-copy にあります。
ラベルの配列またはブールベクトルがインデックス作成操作に関係している場合は常に、結果はコピーになります。単一のラベル/スカラーのインデックス作成とスライスを使用します。 df.ix [3:6]またはdf.ix [:、 'A']、ビューが返されます。
あなたの例では、bar
はfoo
のスライスの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