Переназначение в Pandas: копировать или просматривать?
Скажем, у нас есть следующий фрейм данных:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : randn(8), 'D' : randn(8)})
показано ниже:
> df
A B C D
0 foo one 0.846192 0.478651
1 bar one 2.352421 0.141416
2 foo two -1.413699 -0.577435
3 bar three 0.569572 -0.508984
4 foo two -1.384092 0.659098
5 bar two 0.845167 -0.381740
6 foo one 3.355336 -0.791471
7 foo three 0.303303 0.452966
И тогда я делаю следующее:
df2 = df
df = df[df['C']>0]
Если вы сейчас посмотрите на df
а также df2
вы увидите, что df2
содержит исходные данные, тогда как df
был обновлен, чтобы сохранить только те значения, где C
было больше 0.
Я думал, что Панды не должен был делать копию в задании, как df2 = df
и что он будет делать копии только с:
df2 = df.copy(deep=True)
df2 = copy.deepcopy(df)
Что случилось выше тогда? Сделал df2 = df
сделать копию? Я предполагаю, что ответ - нет, так что, должно быть, df = df[df['C']>0]
что сделал копию, и я предполагаю, что если бы у меня не было df2=df
выше, была бы копия без какой-либо ссылки на нее, плавающая в памяти. Это верно?
Примечание. Я прочитал " Возвращение представления вместо копии", и мне интересно следующее:
Когда в операции индексации участвует массив меток или логический вектор, результатом будет копия.
объясняет это поведение
1 ответ
Это не то df2
делает копию, это то, что df = df[df['C'] > 0]
возвращает копию.
Просто распечатайте идентификаторы, и вы увидите:
print id(df)
df2 = df
print id(df2)
df = df[df['C'] > 0]
print id(df)