这是我的例子:
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
如果df1
是从df
with派生的copy=False
,那么我预计对 的就地修改df1
也会影响df
。但事实并非如此。为什么?
我正在使用 pandas 版本 2.2.1,未启用任何选项(例如写入时复制)
copy=False
意味着底层数据(numpy)是共享的。如果我们修改底层 numpy 数组的一项,则会反映出来,因为数据是共享的:
然而,DataFrame 对象(容器、索引、列名……)并不相同。
通过设置新列,
df1.isetitem(1, [7,8,9])
您只需添加新系列并强制复制。这和python如何处理不可变和可变对象有关。
该选项
copy=False
仅控制是否复制数据框对象内的数据,而不是数据框本身。因此,
rename
函数创建了第二个pd.DataFrame
对象df1
,它可以与 共享数据df
,因为copy=False
。然而,它仍然是一个不同的数据框对象。如果您想更改两个数据框,您可以执行以下操作:
这会同时修改
df
和df1
。