Aqui está meu exemplo:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
In [3]: df1 = df.rename(columns={'b': 'b'}, copy=False)
In [4]: df1.isetitem(1, [7,8,9])
In [5]: df
Out[5]:
a b
0 1 4
1 2 5
2 3 6
In [6]: df1
Out[6]:
a b
0 1 7
1 2 8
2 3 9
Se df1
fosse derivado de df
with copy=False
, então eu esperava que uma modificação no local df1
também afetasse df
. Mas isso não acontece. Por que?
Estou usando o pandas versão 2.2.1, sem opções (por exemplo, copiar na gravação) habilitadas
copy=False
significa que os dados subjacentes (numpy) são compartilhados.Se modificarmos um item da matriz numpy subjacente, isso será refletido, pois os dados são compartilhados:
Os objetos DataFrame (contêineres, índices, nomes de colunas…) não são, entretanto, idênticos.
Ao definir uma nova coluna,
df1.isetitem(1, [7,8,9])
basta adicionar uma nova série e forçar uma cópia.Isso está relacionado à maneira como o python lida com objetos imutáveis e mutáveis.
A opção
copy=False
controla apenas se os dados dentro do objeto dataframe devem ser copiados, e não o próprio dataframe.Assim, as
rename
funções criam um segundopd.DataFrame
objetodf1
, que pode compartilhar os dados comdf
, desdecopy=False
. No entanto, ainda é um objeto de dataframe diferente.Se quiser alterar os dois dataframes, você pode fazer o seguinte:
Isso modifica ambos
df
edf1
.