Pandas: субиндексирующие фреймы данных: копирование и просмотр

Скажем, у меня есть фрейм данных

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 какой-либо механизм copy-on-write?

Ответ 1

Ваш ответ лежит в документах pandas: return-a-view-versus-a-copy.

Всякий раз, когда задействован массив меток или булев вектор в операции индексирования результатом будет копия. Имея единую метку/скалярную индексацию и нарезку, например df.ix [3: 6] или df.ix [:, 'A'], будет возвращено представление.

В вашем примере bar представляет собой представление фрагментов foo. Если вам нужна копия, вы могли бы использовать метод 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