Панды: субиндексация фреймов данных: копии против представлений
Скажи у меня есть датафрейм
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