Переназначение в 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 и что он будет делать копии только с:

  1. df2 = df.copy(deep=True)
  2. 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)
Другие вопросы по тегам