Панды: субиндексация фреймов данных: копии против представлений

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

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 какой-либо механизм копирования при записи?

1 ответ

Решение

Ваш ответ лежит в документах панд: возвращение-просмотр-против-копии.

Когда в операции индексации участвует массив меток или логический вектор, результатом будет копия. При индексировании и разрезании по одной метке / скаляру, например, 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
Другие вопросы по тегам